list - 如何从 Dart 列表中删除相似的元素?

标签 list dart elements equivalent

我想从 Dart 列表中删除相似的元素,其中相似性由一些 bool 函数给出。 例如,在 Mathematica 中,我将按如下方式实现:

Union[{2, -2, 1, 3, 1}, SameTest -> (Abs[#1] == Abs[#2] &)]

此语句产生以下列表 - {-2, 1, 3}。实际上,我想从每个等价类中保留一个元素。

我知道有一个函数 list.retainWhere( (e) => bool test(e) ),不幸的是这个测试一次只能对一个值进行操作。另一种选择,当然,我可以做这样的事情(只是从我的脑海中写出来)

i=0;
for(final E in list) {
  i++;      
  for(j=i; j<list.skip(i).length; j++) {
     if sameTest(e, E) then list.removeAt(i+j);
  }  
}

但我觉得这有点丑。

有什么建议吗?

更新 我将更详细地阐明我的问题,然后展示如何使用下面给出的建议解决它。

  class Pair<T> {
    final T left;
    final T right;
    Pair(this.left, this.right);    
  }

现在我想要一个结构来保存这样的对或,我不想保存彼此足够接近的点。为此,我也采用了 Alexandre Ardhuin 的解决方案和他的评论,这实际上对更复杂的情况有所不同:考虑 2 个元素 e1e2 你必须定义 hashCode 以确保 e1.hashCode == e2.hashCode if e1 == e2

就这样吧:

int N=1000;

LinkedHashSet<Pair<double>> myset =
    new LinkedHashSet<Pair<double>>(
      equals: (Pair<double> e1, Pair<double> e2) =>            
        (e1.left - e2.left)*(e1.left - e2.left) + (e1.right - e2.right)*(e1.right - e2.right) < 1/N,
      hashCode: (Pair<double> e){
        int ex = (e.left*N).round();
        int ey = (e.right*N).round();
        return (ex+ey).hashCode;
      }
);

List<Pair<double>> list = [new Pair<double>(0.1,0.2), new Pair<double>(0.1,0.2001)];
myset.addAll( list );

结果将是 {0.1,0.2}。如果 list 的第二个元素更改为 {0.1, 0.201},我可以预见得到一个包含两个元素的集合。

希望这有用。

最佳答案

您可以使用 LinkedHashSet并定义要使用的equalshashcode

import 'dart:collection';

main() {
  final result = new LinkedHashSet<int>(
      equals: (int e1, int e2) => e1.abs() == e2.abs(),
      hashCode: (int e) => e.abs().hashCode);
  result.addAll([2, -2, 1, 3, 1]);
  print(result); // {2, 1, 3}
}

关于list - 如何从 Dart 列表中删除相似的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208130/

相关文章:

flutter - 底部导航栏中的项目之间的空间

firebase - 无法在Flutter应用程序中获得Silver Effect

c++ - 在集合中查找重复元素并将其分组的快速算法是什么?

javascript - AppleScript:在 javascript 中循环

python - 使用 python 列表中嵌套字典中存储的值验证作为用户输入的出生日期

dart - 如何在没有CORS的Dart编辑器中调试客户端Dart代码

java - 操作数组上的字符串

java - ArrayDeque 添加多个元素

python - 在列表中第一个传递条件的元素后面添加一个元素

python - 如何拆分列表中的字符串