【问题标题】:Removing non unique Objects from a List (identifiable by a property)从列表中删除非唯一对象(可通过属性识别)
【发布时间】:2019-06-13 19:14:51
【问题描述】:

我正在从流中捕获事件,每个事件都是Device Object。流的工作方式是它在一个计时器上,因此它会多次选择同一个设备并添加到流中。

我把所有的都是 List<Device> 并把它放到另一个流中。

我创建了一个StreamTransformer 以尝试从列表中删除重复项,然后将唯一列表添加回流中。

下面的这个转换代码,我尝试添加到设置并返回到列表,但我认为这没有奏效,因为它们是对象而不是字符串。

  //Transform Stream List by removing duplicate objects
  final deviceList = StreamTransformer<List<Device>, List<Device>>.fromHandlers(
      handleData: (list, sink) {
      List<Device> distinctList = list.toSet().toList();
      sink.add(distinctList);
  });

我曾尝试使用 .where 和其他库,但无济于事,希望得到一些指导。

设备对象包含可用于过滤的唯一 ID 和名称 消除重复

问题:如何从 Dart 中的列表中删除重复的对象?

提前致谢。

【问题讨论】:

  • @Günter Zöchbauer 这个是给你的,伙计:)

标签: list object dart stream flutter


【解决方案1】:

首先,您需要定义对象应该是唯一的标准。例如,是否有识别属性?如果是这种情况,以下选项应该可以工作。

最有效的方法可能是使用集合的方法。为此,您需要将对象转换为数据对象,这意味着让它们通过属性值来识别相等性。为此,您将覆盖相等运算符和 hashCode getter。但是,这会改变对象在每个相等操作中的行为方式,因此您必须判断这是否合适。看到这个article

另一种选择是使用 Map 手动过滤:

class MyObj {
  String val;

  MyObj(this.val);
}

TestListFiltering(){
  List<MyObj> l = [
    MyObj("a"),
    MyObj("a"),  
    MyObj("b"),
  ];
  // filter list l for duplicate values of MyObj.val property
  Map<String, MyObj> mp = {};
  for (var item in l) {
    mp[item.val] = item;
  }
  var filteredList = mp.values.toList();
}

【讨论】:

  • 第二个选项效果很好。谢谢奥斯文,你是一位学者,一位绅士。
  • 非常有帮助!谢谢!我现在终于可以放松了哈哈youtube.com/watch?v=MrHxhQPOO2c
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2010-11-13
  • 2013-04-13
相关资源
最近更新 更多