Bir Integers akışı var ve elementlerin indekslerini her elementin değerine göre gruplamak istiyorum.
Örneğin, {1, 1, 1, 2, 3, 3, 4}
endeksler haritalama Listeye tamsayı olarak gruplandırılır:Java 8, Tamsayı Akışı, Bir Akımın Integers Tarafından Gruplandırılması?
1 -> 0, 1, 2
2 -> 3
3 -> 4, 5
4 -> 6
I, ancak ek bir sınıfı ile, akışı kullanılarak çalıştık:
@Test
public void testGrouping() throws Exception {
// actually it is being read from a disk file
Stream<Integer> nums = Stream.of(1, 1, 1, 2, 3, 3, 4);
// list to map by index
int[] ind = {0}; // capture array, effectively final
class Pair {
int left;
int right;
public Pair(int left, int right) {
this.left = left;
this.right = right;
}
}
Map<Integer, List<Integer>> map = nums.map(e -> new Pair(ind[0]++, e))
.collect(Collectors.groupingBy(e -> e.right))
.entrySet().parallelStream()
.collect(Collectors.toConcurrentMap(
Map.Entry::getKey,
e -> e.getValue().parallelStream().map(ee -> ee.left).collect(Collectors.toList())
));
}
I Yayın tarihi Akış okumak zorunda Tamsayı uygulamasında bir disk dosyasından okunur.
Yukarıda yaptığım gibi oldukça iyi bir şekilde optimal yapıyorum. Bunu yapmak için daha iyi veya daha zarif bir yolu var mı?
Yardımlarınız için teşekkürler.
kullanarak: http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors .html # groupingBy-java.util.function.Function-java.util.stream.Collector-? (Üzgünüz, şu anda detaylandırmak için Java8'e sahip olmayın) – GPI