【问题标题】:How can I reach unique pairs in nested list in Dart?如何在 Dart 的嵌套列表中找到唯一对?
【发布时间】:2022-01-14 15:08:31
【问题描述】:

我有这样的代码示例:

在这里,我只想访问 intArr 列表中的唯一对。 我想这样输出; [0, 0] [1, 1] [1, 2] [1, 3] 目前,这些对是否按从小到大的顺序并不重要

【问题讨论】:

  • 邮政编码,不是代码截图。

标签: flutter dart


【解决方案1】:

您可以将已打印的列表存储在变量List<List<int>> alreadySeen 中,并在打印前检查该变量是否包含要打印的列表。

void main() {
  List<List<int>> intArr = [
     [0, 0],
     [1, 1],
     [1, 1],
     [1, 2],
     [1, 3],
     [1, 2],
  ];
 
  List<List<int>> alreadySeen = [];
  
  for (int i = 0; i < intArr.length; i++) {
    if(!contains(alreadySeen, intArr[i])) {
      print(intArr[i]);
      alreadySeen.add(intArr[i]);
    }
  }
}

函数contains 将有2 个嵌套for 循环,一个循环遍历主列表,另一个循环遍历我们正在搜索的列表。 如果needle 值与主列表中的列表匹配,则变量found 保持true 并且函数返回true

bool contains(List<List<int>> list, List<int> needle) {
  if (list.length == 0 || needle.length == 0) return false;
  
  for (int i = 0; i < list.length; i++) {
    if (list[i].length != needle.length) continue;
    
    bool found = true;
    
    for(int j = 0; j < list[i].length; j++) {
      if (list[i][j] != needle[j]) found = false;
    } 
    
    if (found) return true;
  }
  
  return false;
}

请注意,如果您使用颤振,则有一个名为 listEquals 的函数可以使函数 contains 更容易看到 this 但是您不能使用基本函数 intArr.contains 因为它会比较 reference 的数组而不是它们的values

工作Jdoodle

正如@jamesdlin 指出的那样,如果性能对您很重要,您可以使用 LinkedHashSet 而不是 List for alreadySeen 来使 contains 函数 O(1) 而不是 O(n)。

【讨论】:

  • 谢谢! @whygee 它工作正常。
  • 如果完全回答了您的问题,请考虑将答案标记为已接受(下方的复选标记)。
  • 感谢提醒。
  • 这具有 O(n^2) WRT 外部列表长度的低效运行时性能。如果将alreadySeen 改为LinkedHashSet,则它可以变成O(n)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2017-02-26
  • 2020-09-29
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多