【问题标题】:How to create a unique list of values in Java?如何在 Java 中创建唯一的值列表?
【发布时间】:2018-11-10 01:42:58
【问题描述】:

我正在尝试创建一个仅包含唯一值的列表。

String[] arr = {"5", "5", "7", "6", "7", "8", "0"};
    List<String> uniqueList = new ArrayList<String>(new HashSet<String>( Arrays.asList(arr) ));
    System.out.println( uniqueList );

我期望的输出是:6,8,0。所以,如果存在重复,我想删除它们。 HashSet 仅删除重复项,因此每个值仅出现一次。但是,我想删除这两个数字,以便最终得到一个列表,该列表仅包含在原始列表中出现一次的数字。

【问题讨论】:

    标签: java arraylist hashset


    【解决方案1】:

    一种解决方案是建立一个频率Map,并且只保留值等于1的键:

    String[] arr = {"5", "5", "7", "6", "7", "8", "0"};
    
    Arrays.stream(arr)
          .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
          .entrySet()
          .stream()
          .filter(e -> e.getValue() == 1)
          .map(Map.Entry::getKey)
          .collect(Collectors.toList()));
    

    List 的一个可能值是:

    [0, 6, 8]
    

    【讨论】:

    • 啊,你比我快 5 秒!
    • @flakes 我无法告诉你这种情况发生了多少次!
    • 如果我想打印输出怎么办?我可以使用 ArrayList 代替数组吗?
    • @user8231110 上面的代码返回一个List。如果您特别想要ArrayList,则需要将Collector 更改为Collectors.toCollection(ArrayList::new)
    【解决方案2】:

    Stream 的另一种可能性:

    List<String> arr1 = Arrays.asList(arr).stream()
                       .filter(i -> Collections.frequency(Arrays.asList(arr), i)  < 2)
                       .collect(Collectors.toList());
    arr1.forEach(System.out::println);
    

    这将创建一个过滤器,过滤掉所有使用Collections::frequency 多次出现的元素。返回List:

    [6, 8, 0]
    

    【讨论】:

    • O(n^2) 时间复杂度。应该选择不同的解决方案。许多重复可能会导致对Collections.frequency的许多冗余调用
    【解决方案3】:

    另一种可能的解决方案是将列表数据收集到集合中,然后再次返回列表。

    String[] arr = {"5", "5", "7", "6", "7", "8", "0"};
    
    List<String> stringList = Arrays.stream(arr).collect(Collectors.toSet()).stream().collect(Collectors.toList());
    
    for (String s : stringList) {
         System.out.println(s);
    }
    

    【讨论】:

    • OP 已经在原帖中展示了这种东西。这将删除重复项,但这不是 OP 想要做的。他们正试图完全删除任何和所有具有多个条目的项目,比仅重复项更大的修剪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2023-03-16
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多