如何在Java中创建唯一的值列表?

时间:2018-11-10 01:42:58

标签: java arraylist hashset

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

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仅删除重复项,因此每个值仅出现一次。但是,我要删除两个数字,以便最终得到一个列表,该列表仅具有在原始列表中出现一次的数字。

3 个答案:

答案 0 :(得分:3)

一种解决方案是建立频率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]

答案 1 :(得分: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]

答案 2 :(得分:-1)

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

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);
}