Thật khó để nói liệu .sorted().limit((long) N).toArray()
sẽ được tối ưu hóa trong một số trường hợp (đó là thực hiện phụ thuộc nhưng được thực hiện hiện hành của Oracle, tôi sẽ không mong đợi nó), nhưng trong trường hợp đặc biệt này, suối nguồn là một dòng kích thước không xác định làm cho việc tối ưu hóa thậm chí ít có khả năng hơn.
Nếu bạn muốn ở bên an toàn, bạn có thể điều chỉnh this solution để nhận được n số lượng tối đa luồng một cách hiệu quả. Tất cả bạn phải làm là để đảo ngược thứ tự:
public static IntStream maxValuesDescending(IntStream source, int limit) {
TreeMap<Integer,Integer> m=new TreeMap<>(Comparator.reverseOrder());
source.forEachOrdered(new IntConsumer() {
int size, min=Integer.MIN_VALUE;
public void accept(int value) {
if(value<min) return;
m.merge(value, 1, Integer::sum);
if(size<limit) size++;
else m.compute(min=m.lastKey(), (k,count)->count==1? null: count-1);
}
});
if(m.size()==limit)// no duplicates
return m.keySet().stream().mapToInt(Integer::valueOf);
return m.entrySet().stream().flatMapToInt(e->{
int value = e.getKey(), count = e.getValue();
return count==1? IntStream.of(value): IntStream.range(0, count).map(i->value);
});
}
Sau đó, bạn có thể sử dụng nó như
int[] arr = maxValuesDescending(in.lines().mapToInt(Integer::parseInt), N).toArray();
Nhưng bạn không cần phải tạo ra một mảng như bạn có thể sử dụng tùy ý IntStream
hoạt động trên kết quả . Giải pháp này sẽ giữ ở hầu hết các giá trị N
, thậm chí ít hơn nếu có các bản sao vì nó chỉ giữ các giá trị riêng biệt và số lượng của chúng.
Nếu bạn biết bạn sẽ không có bất kỳ giá trị 'Integer.MIN_VALUE', bạn có thể thêm một bước để lập bản đồ ' i -> (-i) '. (Trình độ 'Integer.MIN_VALUE' là quan trọng, vì' Integer.MIN_VALUE == (- Integer.MIN_VALUE) '). – yshavit
Ngoài ra, bạn có biết nếu combo sắp xếp được tối ưu hóa không? Bởi vì nếu không, sẽ có một cơ hội tốt để 'sắp xếp()' sẽ lưu trữ tất cả chúng trong bộ nhớ, trong trường hợp đó bạn cũng có thể lấy mảng đó và đọc N phần tử lớn nhất. – yshavit
@yshavit Tôi nghĩ rằng bạn đang đúng về các combo sắp xếp giới hạn, nó phải lưu trữ nó trong một số container trung gian – Aurumae