gpt4 book ai didi

Java 8 Streams如何避免使用map或set进行过滤?

转载 作者:行者123 更新时间:2023-12-01 19:37:06 25 4
gpt4 key购买 nike

我不断遇到我想要/认为我需要通过映射或集合保存状态的解决方案。例如创建一个返回输入中找到的重复项的方法

// non streams solution
public int[] getDuplicates(int[] input){
Set<Integer> allSet = new HashSet<Integer>();
Set<Integer> duplicates = new HashSet<Integer>();

int[] dups = new int[input.length];
int j = 0;
for (Integer i : input) {
if (!allSet.add(i)) {
if(duplicates.add(i)) {
dups[j++] = i;
}
}
}
return Arrays.copyOfRange(dups, 0, j);
}

我的 Java 8 Streams 解决方案,不幸的是我使用 HashSet 进行过滤。我知道这不是“正确的”,因为它取决于状态。没有国家是建议还是硬性规定?这只是运行并行流时的问题吗?有人可以建议一种不在这里使用 HashSet 的方法吗?

public static int[] getDuplicatesStreamsToArray(int[] input) {
Set<Integer> allSet = new HashSet<>();
int[] dups = Arrays.stream(input)
.sequential() // prevents parallel processing
.unordered() // speed up distinct operation
.boxed() // int to Integer
.filter(n -> !allSet.add(n)) // passes dups, but uses STATE
.distinct() // uses internal Set of dups
.mapToInt(i -> i) // Integer back to int
.toArray();
return dups;
}

最佳答案

这个怎么样:

基本上,创建 Map<Integer,Long> 类型的频率计数并返回那些 keys其中value大于 1。

    public static int[] getDuplicatesStreamsToArray(int[] input) {

int[] dups = Arrays.stream(input).boxed().collect(
Collectors.groupingBy(Function.identity(),
Collectors.counting())).entrySet().stream().filter(
e -> e.getValue() > 1).mapToInt(
e -> e.getKey()).toArray();
return dups;
}

我误解了你之前想要做的事情。

关于Java 8 Streams如何避免使用map或set进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57083672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com