Ich habe Daten, die als eine Liste von positiven doppelten Zahlen dargestellt wird, und eine Liste mit den Intervallen, die verwendet werden, um die Daten zu gruppieren. Das Intervall wird immer sortiert.
ich zu einer Gruppe versucht, die Daten mit der folgenden ImplementierungGruppierung Double mit Java 8 nach beliebigem Intervall zu Karte
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;
}
Ist es möglich, auf die Daten direkt die Logik dieser Art von groupping/Verringerung auszuführen, indem durch Sammler?
Zusätzlich zu der Komplexität des Prozesses sollte dies n^2 dauern, da wir über zwei Listen (oder Streams) iterieren. Jetzt ist es nicht parallel, aber ich denke, es ist möglich, getGroup() paralel durchzuführen. Irgendein Einblick sollte TreeSet oder Liste für bessere Leistung verwendet werden?
Beachten Sie, dass Sie nicht brauchen, zu * Strom * a * foreach zu tun *, da es Teil der 'Iterable' Schnittstelle ist. –