【问题标题】:How can I make Array (list) Elements Unique in Dart?如何使 Dart 中的数组(列表)元素唯一?
【发布时间】:2012-10-15 21:19:06
【问题描述】:

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

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

谢谢,

_g

【问题讨论】:

    标签: arrays list element unique dart


    【解决方案1】:

    使用 toset 然后 toList

     var ids = [1, 4, 4, 4, 5, 6, 6];
     var distinctIds = ids.toSet().toList();
    

    【讨论】:

      【解决方案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");
      }
      

      【讨论】:

      • 谢谢,我会记住 LinkedHashMap。在我的工作中一次又一次地需要保持一组有序的独特元素,这归结为问题的基础。很高兴知道。
      • 我为 LinkedSets 创建了一个问题:code.google.com/p/dart/issues/detail?id=5976
      • 现在 dart 中有一个 LinkedHashSet 实现。
      【解决方案3】:

      数组对象 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);
          }
      

      【讨论】:

        【解决方案4】:

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

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

        我会推荐 1.

        约翰

        【讨论】:

          【解决方案5】:

          您可以像使用该列表一样使用该列表,也可以像 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().indexOfDART library documentation 的集合部分有更详细的解释

          【讨论】:

          • @georgekoller:这对您有任何帮助还是您对此仍有疑问?
          • Dart 仍处于 Alpha 阶段,我犹豫是否要开始扩展课程,因为看起来许多问题几乎每天都在解决。您对使用 (v.indexOf(item) != -1) 的建议是我所使用的,它似乎按预期工作,它应该是有效的。再次感谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 2017-04-12
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 2010-11-16
          相关资源
          最近更新 更多