【问题标题】:Save a list of unique Strings in the ArrayList在 ArrayList 中保存唯一字符串列表
【发布时间】:2011-01-15 04:21:50
【问题描述】:

我从文本文件中读取数据,所以可能有:

约翰 玛丽 约翰 利兹

我现在需要在 ArrayList 中获取 3 个唯一元素,因为文件输出中只有 3 个唯一值(如上)。

我可以使用 HashTable 并向其添加信息,然后简单地将其数据复制到列表中。 还有其他解决方案吗?

【问题讨论】:

    标签: java collections arraylist


    【解决方案1】:
     List<String> distinctElements = list.stream()
                .distinct().filter(s -> s != null && s != "")
                .collect(Collectors.toList());
    

    这将收集不同的项目并避免 null 或空字符串

    【讨论】:

      【解决方案2】:

      另一种方法是使用 Java 8 流的 distinct

      import java.util.Arrays;
      import java.util.List;
      import java.util.stream.Collectors;
      
      // public static void main(String args[]) ...
      
      // list of strings, including some nulls and blanks as well ;)
      List<String> list = Arrays.asList("John", "Mary", "John", "Leeds", 
      null, "", "A", "B", "C", "D", "A", "A", "B", "C", "", null);
       
      // collect distinct without duplicates
      List<String> distinctElements = list.stream()
                              .distinct()
                              .collect(Collectors.toList());
       
      // unique elements
      System.out.println(distinctElements);
      

      输出:

       [John, Mary, Leeds, null, , A, B, C, D]
      

      【讨论】:

        【解决方案3】:
        class HashSetList<T extends Object>
            extends ArrayList<T> {
        
            private HashSet<Integer> _this = new HashSet<>();
        
            @Override
            public boolean add(T obj) {
                if (_this.add(obj.hashCode())) {
                    super.add(obj);
                    return true;
                }
                return false;
            }
        }
        

        我现在将这种结构用于小程序,我的意思是您几乎不需要开销即可拥有 getter 和 setter,但具有唯一性。此外,您可以覆盖hashCode 来决定您的项目是否等于另一个。

        【讨论】:

        • 好主意,但是...那么 remove 和 add(int, *) 等呢?此解决方案不完整。
        【解决方案4】:

        我是这样解决的:

        import groovy.io.*;
        def arr = ["5", "5", "7", "6", "7", "8", "0"]
        List<String> uniqueList = new ArrayList<String>(new HashSet<String>( arr.asList() ));
        System.out.println( uniqueList )
        

        【讨论】:

          【解决方案5】:

          如果您有一个包含重复项的 List,而您想要一个不包含重复项的 List,您可以这样做:

          List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));
          

          也就是说,将旧列表包装成一个集合以删除重复项并将该集合再次包装在一个列表中。

          【讨论】:

          • 我猜,不能保证newList的排序会和oldList的排序一样,或者?
          • 好的。我找到了我的评论的答案:如果您使用 LinkedHashSet 而不是 HashSet,您将保留订单。
          【解决方案6】:

          使用set 而不是列表。看看这里:Java Collections Tutorials,特别是关于这里的集合:Java Sets Tutorial

          简而言之,集合包含某物之一。完美:)

          【讨论】:

            【解决方案7】:

            为什么需要将其存储在List 中?您是否确实需要对数据进行排序或支持基于索引的查找?

            我建议将数据存储在Set 中。如果订购不重要,您应该使用HashSet。但是,如果您希望保留订单,可以使用 LinkedHashSet

            【讨论】:

            • 为什么?原因列表最常使用,并且易于使用。我认为如果您为其他开发人员编写代码,最好返回 List 类型而不是任何其他类型。
            • 不一定。您需要列表的唯一情况是您希望随机索引访问集合中的项目。否则,最好使用普通的 HashSet 或 LinkedHashSet。
            • @EugeneP:不要用 Java 编写 C 代码。在每种语言中,最好利用其自身的特性。
            • @EugeneP:我不同意返回 List 比返回任何其他类型更好。最好返回适当的数据结构。如果唯一性很重要但排序不重要,则返回一个 Set。如果两者都不重要,则返回一个集合。如果您只想迭代元素,则返回一个 Iterable。调用代码与内部实现越分离,就越容易在不同的实现中进行更改或替换。
            • @EugeneP:我想你的意思是没有理由仅仅为了符合教条而使用某些东西。我不同意。但在这种情况下,List 既不必要又效率较低(O(n^2) vs O(n))。除非您确实需要保留Strings 的顺序,否则在实践中使用List 确实是一个更糟糕的选择。 for(;;) 的情况并非如此。可能使用List 对您来说更自然,因为C 并没有像Set 这样的数据结构,但使用起来确实不是很自然。
            【解决方案8】:

            添加前可以查看list.contains()

            if(!list.contains(value)) {
                list.add(value);
            }
            

            我猜这很明显!但是,将项目添加到 HashSet,然后从该集合创建列表会更有效。

            【讨论】:

            • 我想它使用“equals”方法?
            • 是的,它在内部的字符串上使用了 equals()。
            • 是的。谢谢。在我的情况下,这将是可取的,因为代码将保持干净。但我猜 HashTable 算法比 contains 方法快,除非他们在内部使用 HashTable。
            猜你喜欢
            • 2021-12-12
            • 2022-01-21
            • 2012-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-12
            • 1970-01-01
            • 2021-07-16
            相关资源
            最近更新 更多