如何在 Java 中的 HashSet 中只打印唯一的非重复值?
How to print only unique non repeated values in a HashSet in Java?
下面的代码给出的输出为一二三。 但我只需要打印唯一的非重复元素,即只出现一次的三个元素。
为了从 1,2,3,3,2,4,5,5,4,6,6,7 的 arrayList 中更清楚,我只需要得到不重复的 1,7。
ArrayList<String> aListNumbers = new ArrayList<String>();
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("Three");
HashSet<String> hSetNumbers = new HashSet(aListNumbers);
System.out.println("ArrayList Unique Values");
for(String strNumber : hSetNumbers)
System.out.println(strNumber); ```
我会为这项工作使用流:
Set<String> hSetNumbers = aListNumbers.stream().distinct()
.filter(num1 -> aListNumbers.stream().filter(num1::equals).count() == 1)
.collect(Collectors.toSet());
hSetNumbers.forEach(System.out::println);
您可以先使用分组收集器,然后仅使用一个元素过滤这些列表:
List<String> aListNumbers = new ArrayList<>();
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("Three");
aListNumbers.stream()
.collect(Collectors.groupingBy(x -> x))
.values()
.stream()
.filter(l -> l.size() == 1)
.map(l -> l.get(0))
.forEachOrdered(System.out::println);
编辑:
刚想到另一种我觉得更优雅的方法:
aListNumbers.stream()
.collect(Collectors.groupingBy(x -> x, counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() == 1)
.map(Entry::getKey)
.forEachOrdered(System.out::println);
您需要从流中过滤出频率为 1
.
的元素(源自列表)
按如下操作:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> aListNumbers = new ArrayList<>(List.of("One", "Two", "Three", "One", "Two"));
Set<String> hSetNumbers = aListNumbers
.stream()
.filter(e -> Collections.frequency(aListNumbers, e) == 1)
.collect(Collectors.toSet());
System.out.println(hSetNumbers);
}
}
输出:
[Three]
所有其他答案都会进行不必要的计算或使用比需要更多的内存,因此:
Map<String, Long> counted = aListNumbers.stream()
.collect(Collectors.groupingBy(el -> el, Collectors.counting()));
counted.entrySet().stream()
.filter(entry -> entry.getValue() == 1)
.forEach(entry -> System.out.println(entry.getKey()));
下面的代码给出的输出为一二三。 但我只需要打印唯一的非重复元素,即只出现一次的三个元素。 为了从 1,2,3,3,2,4,5,5,4,6,6,7 的 arrayList 中更清楚,我只需要得到不重复的 1,7。
ArrayList<String> aListNumbers = new ArrayList<String>();
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("Three");
HashSet<String> hSetNumbers = new HashSet(aListNumbers);
System.out.println("ArrayList Unique Values");
for(String strNumber : hSetNumbers)
System.out.println(strNumber); ```
我会为这项工作使用流:
Set<String> hSetNumbers = aListNumbers.stream().distinct()
.filter(num1 -> aListNumbers.stream().filter(num1::equals).count() == 1)
.collect(Collectors.toSet());
hSetNumbers.forEach(System.out::println);
您可以先使用分组收集器,然后仅使用一个元素过滤这些列表:
List<String> aListNumbers = new ArrayList<>();
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("Three");
aListNumbers.stream()
.collect(Collectors.groupingBy(x -> x))
.values()
.stream()
.filter(l -> l.size() == 1)
.map(l -> l.get(0))
.forEachOrdered(System.out::println);
编辑: 刚想到另一种我觉得更优雅的方法:
aListNumbers.stream()
.collect(Collectors.groupingBy(x -> x, counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() == 1)
.map(Entry::getKey)
.forEachOrdered(System.out::println);
您需要从流中过滤出频率为 1
.
按如下操作:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> aListNumbers = new ArrayList<>(List.of("One", "Two", "Three", "One", "Two"));
Set<String> hSetNumbers = aListNumbers
.stream()
.filter(e -> Collections.frequency(aListNumbers, e) == 1)
.collect(Collectors.toSet());
System.out.println(hSetNumbers);
}
}
输出:
[Three]
所有其他答案都会进行不必要的计算或使用比需要更多的内存,因此:
Map<String, Long> counted = aListNumbers.stream()
.collect(Collectors.groupingBy(el -> el, Collectors.counting()));
counted.entrySet().stream()
.filter(entry -> entry.getValue() == 1)
.forEach(entry -> System.out.println(entry.getKey()));