从列表中删除非唯一对象(可由属性标识)

时间:2019-01-19 23:44:08

标签: list object dart stream flutter

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

我要把所有List<Device>放到另一个流中。

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

下面的此转换代码,我尝试添加到set并返回到list,但是由于它们是对象而不是字符串,因此我认为这没有用。

  //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中的列表中删除重复的对象?

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,您需要定义根据哪些标准对象应该是唯一的。例如,是否有识别属性?在这种情况下,以下选项应该起作用。

最有效的方法可能是使一组方法一起工作。为此,您需要将您的对象变成数据对象,这意味着让它们通过属性值来标识是否相等。为此,您将覆盖均等运算符和哈希码方法。但是,这会改变对象在每个相等操作上的行为。因此,您必须判断这是否合适。参见此article

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

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();
}