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

Posted

技术标签:

【中文标题】如何不在列表飞镖中重复相同的项目?【英文标题】:How to not duplicate same item in a list dart? 【发布时间】:2020-02-21 13:53:30 【问题描述】:

我创建了一个 listView 和按钮,当我单击按钮时,它会向 listView 添加一个项目。

问题是我实际上不想在列表中重复相同的项目。

我尝试了 .contains 方法,但没有成功。

我想要一个好的解决方案,

【问题讨论】:

【参考方案1】:

有不同的方法来实现这一点:

1) 迭代列表并检查是否每个元素都没有 您认为相等的属性:

items = [Item(id: 1), Item(id: 2)];
newItem = Item(id: 2);
if (items.every((item) => item.id != newItem.id)) 
  items.add(newItem);

2) 使用contains() 并覆盖== operator(也覆盖hashCode) 在具有您认为相等的属性的对象类中。

items = [Item(id: 1), Item(id: 2)];
newItem = Item(id: 2);
if (!items.contains(newItem)) 
  items.add(newItem);


// inside Item class
@override
bool operator ==(other) 
  return this.id == other.id;


@override
int get hashCode => id.hashCode;

3) 代替List 使用Set,其中每个元素只能出现一次。它的默认实现是LinkedHashSet,用于跟踪订单。

【讨论】:

【参考方案2】:

使用集合代替列表。

void main() 
  Set<String> currencies = 'EUR', 'USD', 'JPY';
  currencies.add('EUR');
  currencies.add('USD');
  currencies.add('INR');
  print(currencies);

输出:EUR, USD, JPY, INR // unique items only

参考:Set<E> class

【讨论】:

【参考方案3】:

在添加之前检查 List 是否已经包含该元素: https://api.flutter.dev/flutter/dart-core/List-class.html

if(!List.contains(element)  add 

contains 方法检查是否相等,而不是用于参考,因此只要您比较相似的元素,它就必须工作。如果您的代码不起作用,请提供给我们。谢谢。

【讨论】:

【参考方案4】:

如果您的列表包含自定义对象,您可能需要覆盖自定义类中的 equality operator。

您也可以使用Set 代替列表。

【讨论】:

以上是关于如何不在列表飞镖中重复相同的项目?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在颤振飞镖中使用相同的元素初始化列表?

如何对实例类列表进行排序取决于其在飞镖或颤振中的属性[重复]

如何在飞镖编程中合并列表中的相似项目? [复制]

如何在颤振/飞镖中缓存列表视图构建器?

如何在颤动/飞镖的 ListView 项目中更改背景颜色