Java 从流中的两个列表创建隔离值的映射

Java 从流中的两个列表创建隔离值的映射,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试创建两个列表的映射。第一个列表用于键,第二个用于隔离和分配值,其中并没有值匹配已分配的bin的情况将是空列表。值应该像键5一样赋值这是我的第一个解决方案,它基本上将您的值合并到一个语句中。请注意,使用大型列表执行此操作的成本很高,因此我将同时寻找更高效的方法: sampleBins.stream() .collect(Collectors.toMap(bin -> bin / 10, bin -> samples.stream

我正在尝试创建两个列表的映射。第一个列表用于键,第二个用于隔离和分配值,其中并没有值匹配已分配的bin的情况将是空列表。值应该像键5一样赋值这是我的第一个解决方案,它基本上将您的值合并到一个语句中。请注意,使用大型列表执行此操作的成本很高,因此我将同时寻找更高效的方法:

sampleBins.stream()
          .collect(Collectors.toMap(bin -> bin / 10, bin ->
              samples.stream()
                     .filter(i -> i - i % 10 == bin)
                     .collect(Collectors.toList())
          ));
这将产生以下结果:

{0=[5,6],1=[],2=[],3=[],4=[],5=[55,52],6=[]

下面是另一个非常简单的解决方案:

samples.stream().collect(Collectors.groupingBy(i -> i - i % 10));
但是,它将输出以下内容,而不是将其他存储箱设置为空
列表
s,这在您的情况下可能是问题,也可能不是问题,因为您可以简单地检查该存储箱是否作为键存在于
映射中

{0=[5,6],50=[55,52]}


如果我发现其他有趣的东西,我会编辑我的帖子,所以请留意

在我看来,对样本进行分类的方法是固定的。垃圾箱的唯一区别是指定您感兴趣的内容。因此,首先,没有太多的必要关注你的垃圾箱

Map<Integer, List<Integer>> segregateSamples(List<Integer> sampleBins, List<Integer> samples) {

    Map<Integer, List<Integer>> groupedSamples = samples.stream().collect(Collectors.groupingBy(x -> 10 * x / 10));

    return sampleBins.stream().collect(Collectors.toMap(Function.identity(), b -> 
            groupedSamples.getOrDefault(b, Collections.emptyList())));
}
映射样本(列出样本箱,列出样本){
Map groupedSamples=samples.stream().collect(Collectors.groupingBy(x->10*x/10));
返回sampleBins.stream().collect(Collectors.toMap(Function.identity(),b->
groupedSamples.getOrDefault(b,Collections.emptyList());
}

此函数首先对您的样本进行分组,然后根据您感兴趣的箱子,从地图中提取列表,或者如果没有列表,则创建一个空列表。

concat列表如何,然后创建单个并行流

private Map<Integer, Collection<Integer>> segregateSamples(List<Double> sampleBins, List<Double> samples) {
    Stream<Double> d = Stream.concat(sampleBins.stream(), samples.stream()).parallel();
    return d.collect(Collectors.groupingByConcurrent(p -> (p.intValue() / 10),
                    Collectors.mapping(Double::intValue, Collectors.toCollection(ArrayDeque::new))));
}
private-Map-samples(列出样本箱,列出样本){
Stream d=Stream.concat(sampleBins.Stream(),samples.Stream()).parallel();
返回d.collect(Collectors.groupingByConcurrent(p->(p.intValue()/10)),
Collectors.mapping(Double::intValue,Collectors.toCollection(ArrayDeque::new));
}

唯一的缺点是每个集合都包含其密钥

i-i%10-等值0%10@SeniorPomidor这并不是因为运算符的优先级。如果没有值匹配,则在进一步的计算中使用空列表保留解是很重要的。那么,我的第一个解决方案对你来说就完美了。在此期间,我将尝试做些更好的事情。顺便问一下,您的数据集有多大?我假设每个请求最多有9k个数据集,但通常少于1K个。“应该有一件事,如果一个人有足够高的声誉,他应该看到被否决的选民的名字。我同意,似乎有人在否决我们两个。”雅各布。我可以想象一些初级学生以一种糟糕的方式问了一些初级问题,然后被人打了一顿。现在他在报复,对他能抓住的每一个答案和问题都投了否决票。老实说,我也不理解对你们投否决票,至少在没有提供理由的情况下
private Map<Integer, Collection<Integer>> segregateSamples(List<Double> sampleBins, List<Double> samples) {
    Stream<Double> d = Stream.concat(sampleBins.stream(), samples.stream()).parallel();
    return d.collect(Collectors.groupingByConcurrent(p -> (p.intValue() / 10),
                    Collectors.mapping(Double::intValue, Collectors.toCollection(ArrayDeque::new))));
}