Trudno powiedzieć, czy .sorted().limit((long) N).toArray()
dostanie zoptymalizowane w niektórych przypadkach (jest zależna od implementacji, ale biorąc pod uwagę obecną realizację Oracle, nie będę go oczekiwać), ale w tym szczególnym przypadku, strumień źródłem jest strumień nieznany rozmiar, który sprawia, że optymalizacja jest jeszcze mniej prawdopodobna.
Jeśli chcesz być na bezpiecznej stronie, można dostosować this solution dla coraz n maksymalną liczbę strumienia sprawnie. Wszystko co musisz zrobić, to odwrócić kolejność:
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);
});
}
Wtedy można go używać jak
int[] arr = maxValuesDescending(in.lines().mapToInt(Integer::parseInt), N).toArray();
Ale nie są wymagane do utworzenia tablicy, jak można użyć dowolnych IntStream
operacji na wynik . To rozwiązanie będzie zawierać najwyżej wartości N
, a nawet mniej, jeśli istnieją duplikaty, ponieważ zawiera tylko różne wartości i ich liczbę.
Jeśli wiesz, że nie będzie miał żadnych 'wartości Integer.MIN_VALUE', można dodać do mapy krok' i -> (-i) '. (Kwalifikacja 'Integer.MIN_VALUE' jest ważna, ponieważ' Integer.MIN_VALUE == (- Integer.MIN_VALUE) '). – yshavit
Czy wiesz, że kombinacja limitu sortowania jest zoptymalizowana? Bo jeśli nie, istnieje duża szansa, że 'sorted()' i tak zapisze je wszystkie w pamięci, w takim przypadku możesz równie dobrze pobrać tę tablicę i przeczytać N najwspanialszych elementów. – yshavit
@yshavit Myślę, że masz rację co do limitu sortowania, musisz go przechowywać w jakimś pośrednim pojemniku. – Aurumae