6

我需要从列表中删除多余的(字符串)元素。或者,也许从一开始就阻止他们进入是更好的解决方案?套装不允许重复,但它们也不能保持顺序,我需要顺序。这对我来说是一个常见问题,因此我正在寻找一种可能的语言解决方案以提高效率。

(过去我扩展了一个数组类来添加我自己的 add_unique() 方法,但这似乎是一个常见的问题,可以由语言处理,并且可能更有效。)

谢谢,

_G

4

6 回答 6

19

使用toset然后toList

 var ids = [1, 4, 4, 4, 5, 6, 6];
 var distinctIds = ids.toSet().toList();
于 2019-08-22T12:38:36.480 回答
2

您需要一个 LinkedSet 来仅包含唯一性并保持插入顺序,但目前我们在 dart 中没有它。但是,您可以使用 LinkedHashMap 模拟 LinkedSet:

var input = ["apple", "orange", "cherries", "pears", "apple", "apple", "orange"];
var uniques = new LinkedHashMap<String, bool>();
for (var s in input) {
  uniques[s] = true;
}
for (var key in uniques.getKeys()) {
  print ("$key");
}
于 2012-10-16T14:48:17.920 回答
1

数组对象 DART,在https://dartpad.dev/4d3a724429bbd605f4682b7da253a16e中测试

void main() {
      var duplicates = [
        {"b": 1},
        {"b": 2},
        {"b": 1},
        {"b": 2}
      ];
    
      var resArr = [];
      duplicates.forEach((item) {
        var i = resArr.indexWhere((x) => x["b"] == item["b"]);
        if (i <= -1) {
          resArr.add({"b": item["b"]});
        }
      });
      print(resArr);
    }
于 2020-07-10T06:22:29.283 回答
0

今天,这必须手动完成。Dart 不提供保持插入顺序的集合。请注意,Dart 容器库将被修改。请访问 www.dartbug.com 并添加此功能请求。要手动执行此操作,您可以:

1)在添加之前调用 indexOf 。2)维护一个集合和一个列表。Set 可用于保持事物的唯一性,同时 List 保持顺序。

我会推荐1。

约翰

于 2012-10-15T21:39:34.560 回答
0

您可以照常使用该列表,并cutch如前所述手动添加您自己的方法来验证重复项和排序,如下所示。

import 'dart:html';

var someList = new List<String>();
String newItem = '';

void main() {
  newItem = 'item 3';  
  if(!itemExistsInList(someList, newItem)){
    someList.add(newItem);
    sortList(someList);
  }

  // expected item 3
  print(someList);

  newItem = 'item 1';
  if(!itemExistsInList(someList, newItem)){
    someList.add(newItem);
    sortList(someList);
  }

// expected item 1, item 3
  print(someList);

  newItem = 'item 3';
  if(!itemExistsInList(someList, newItem)){
    someList.add(newItem);
    sortList(someList);
  }

// expected item 1, item 3. Same as previous as secondary item 3 was not added
  print(someList);
}

// returns true if the specified item already exists in the specified list
// otherwise false
bool itemExistsInList(List<String> list, String item){
  return list.some((v) => v.indexOf(item) != -1);
}

// sorts the list
void sortList(List<String> list){
  list.sort((a, b) => a.compareTo(b));
}

不需要sortList()每次添加时都调用该函数,我这样做只是为了演示。只有在您真正需要时才调用它就足够了。

.sort().some()并在DART 库文档.indexOf的集合部分中进行了更详细的说明

于 2012-10-15T23:25:01.977 回答
0
**Several packages exist that expand on default the Iterable utility methods, such as flinq or darq. They add a distinct method you can call to easily get a list of unique members of a list based on some property of the members.**

import 'package:darq/darq.dart';

void main() {
  var list = [
    Data('a'),
    Data('a'),
    Data('b'),
    Data('c'),
  ];
  var distinct = list.distinct((d) => d.id).toList();
}
于 2022-01-09T05:10:27.507 回答