如何删除列表中重复的构造对象,同时保留顺序并在飞镖中返回列表?

Posted

技术标签:

【中文标题】如何删除列表中重复的构造对象,同时保留顺序并在飞镖中返回列表?【英文标题】:How to delete duplicate constructed objects in a list while preserving order and returning a List in dart? 【发布时间】:2019-11-13 17:41:26 【问题描述】:

我有一个名为RecentCard 的构造对象列表,它基本上是一个带有用户ID、图片和名称的对象。我创建了一个列表,根据时间戳按最近交互的顺序排列。但是我需要摆脱任何重复对象的第二次出现及以后。我只比较 id,因为用户可能有相同的姓名或照片,我无法从简单的 uid 列表中删除重复项,因为这样我可能会丢失相应照片和姓名的顺序。

例如,列表看起来像这样:

List<RecentCard> recentCards= [RecentCard(uid:as721dn18j2,name:mike,photourl:https://sadadasd1d1),RecentCard(.....]

我已经搜索过解决方案,但它们都在处理像简单字符串列表这样的原始类型,而这些解决方案对我不起作用。例如这篇文章:How to delete duplicates in a dart List? list.distinct()?阅读下文

第一个答案的链接不再可用,下一个答案是我尝试过的,但它根本不起作用我不知道为什么可能是因为它不是原始类型。查询包的下一个答案不起作用,因为我正在使用列表来构建 listview.builder 所以当我调用 list.length 它说我不能在可迭代或其他东西上调用它。最终解决方案行不通,因为它说 String 不是 RecentCard 的子类型。

我尝试使用两个 forloop,第二个只是将第一个值与下一个值进行比较,但这不起作用,因为如果找到重复项,则会删除对象并且长度会混乱,因此会跳过一些元素。

有什么想法吗?我觉得它很简单,但我不知道该怎么做。

【问题讨论】:

【参考方案1】:

您必须使用Set 来存储看到的卡片,然后过滤掉那些已经在集合中的卡片。

final seenCards = Set<String>();
final uniqueCards = recentCards.where((card) => seenCards.add(card.uid)).toList();

【讨论】:

任何想尝试的人的例子dartpad.dartlang.org/a3a4160140584285b31189654aa59ab2 感谢@Niko,这个答案为我节省了很多精力!!

以上是关于如何删除列表中重复的构造对象,同时保留顺序并在飞镖中返回列表?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

在保留顺序函数的同时删除向量中的重复项的逻辑错误

如何根据元组的索引值从列表中删除重复的元组,同时保持元组的顺序? [复制]

Python List:这是在保留顺序的同时删除重复项的最佳方法吗? [复制]

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

如何不在列表飞镖中重复相同的项目?