Tôi nhận được một dòng Số nguyên và tôi muốn nhóm các chỉ mục của các phần tử theo giá trị của từng phần tử.
Ví dụ, {1, 1, 1, 2, 3, 3, 4}
được nhóm như Integer để liệt kê các chỉ số bản đồ:Java 8, Stream of Integer, Chỉ mục nhóm của một luồng theo các số nguyên?
1 -> 0, 1, 2
2 -> 3
3 -> 4, 5
4 -> 6
Tôi đã thử sử dụng dòng, nhưng với một lớp học thêm:
@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())
));
}
tôi phải đọc Suối kể từ Stream của Integer được đọc từ một tệp đĩa trong ứng dụng của tôi.
Tôi cảm thấy cách làm như trên là khá tối ưu. Có cách nào tốt hơn hay thanh lịch hơn để làm điều đó?
Cảm ơn sự giúp đỡ của bạn.
Có thể sử dụng: http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors .html # groupingBy-java.util.function.Function-java.util.stream.Collector-? (Xin lỗi, không có Java8 ngay bây giờ để xây dựng) – GPI