【问题标题】:Dart: Check items in List of listsDart:检查列表中的项目
【发布时间】:2020-05-24 10:43:27
【问题描述】:

在添加列表之前,我想检查它是否不存在,因此没有重复的值。这适用于整数列表,但不适用于其他整数列表:

void main() {
  var listasN = List<int>();
  var n1 = 1;
  var n2 = 2;
  var n3 = 1;
  void addN(int n) {
    if (!listasN.contains(n)) {
      listasN.add(n);
    }
  }
  addN(n1);
  addN(n2);
  addN(n3);
  print(listasN);

  var listas = List<List<int>>();
  var lista1 = [1, 2, 3, 4];
  var lista2 = [5, 6, 7, 8];
  var lista3 = [1, 2, 3, 4];
  void addLista(List<int> ls) {
    if (!listas.contains(ls)) {
      listas.add(ls);
    }
  }
  addLista(lista1);
  addLista(lista2);
  addLista(lista3);
  print(listas);
}

输出:

[1, 2]
[[1, 2, 3, 4], [5, 6, 7, 8], [1, 2, 3, 4]]

第一个函数不支持重复值,但第二个支持,为什么?

【问题讨论】:

    标签: list dart


    【解决方案1】:

    Dart 列表没有内在的相等性。也就是说,== 运算符仅在相同列表时才认为列表相等,而不是在具有相同内容的不同列表时。 这通常是 Dart 处理可变类型相等性的方式。 contains 方法使用相等性进行检查。

    因此,您可以做的是创建一个“列表等于”方法:

    bool listEquals<T>(List<T> list1, List<T> list2) {
      if (list1.length != list2.length) return false;
      for (var i = 0; i < list1.length; i++) {
        if (list1[i] != list2[i]) return false;
      }
      return true;
    }
    

    然后您可以检查列表中是否包含相似列表:

    void addLista(List<int> ls) {
      if (!listas.any((ls2) => listEquals(ls, ls2))) {
        listas.add(ls);
      }
    }
    

    【讨论】:

    • 好的,非常感谢。一个细节:我认为有必要关闭 ) in: if (!listas.any((ls2) => listEquals(ls, ls2))) {:
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多