私は正の倍数のリストとデータをグループ化するために使用される間隔を含むリストとして表されるデータを持っています。間隔は常にソートされます。私はグループに次の実装マップする任意の間隔でJava 8を使用してダブルをグループ化
List<Double> data = DoubleStream.generate(new Random()::nextDouble).limit(10).map(d -> new Random().nextInt(30) * d).boxed().collect(Collectors.toList());
HashMap<Integer, List<Double>> groupped = new HashMap<Integer, List<Double>>();
data.stream().forEach(d -> {
groupped.merge(getGroup(d, group), new ArrayList<Double>(Arrays.asList(d)), (l1, l2) -> {
l1.addAll(l2);
return l1;
});
});
public static Integer getGroup(double data, List<Integer> group) {
for (int i = 1; i < group.size(); i++) {
if (group.get(i) > data) {
return group.get(i - 1);
}
}
return group.get(group.size() - 1);
}
public static List<Integer> group() {
List<Integer> groups = new LinkedList<Integer>();
//can be arbitrary groupping
groups.add(0);
groups.add(6);
groups.add(11);
groups.add(16);
groups.add(21);
groups.add(26);
return groups;
}
でデータを試してみました
はコレクターを通じて、データを直接ロジックを実行することにより、減少/ grouppingのこの種を行うことが可能ですか?
さらに、プロセスの複雑さを考えると、2つのリスト(またはストリーム)を繰り返し処理するので、これはn^2になります。今では並列ではありませんが、パラレルでgetGroup()を実行することは可能だと思います。パフォーマンスを向上させるには、TreeSetまたはListを使用する必要があります。
それは 'Iterable'インターフェイスの一部であるとして、あなたは* *ますforeachを行うために*ストリーム*する必要はありません。 –