E 'difficile dire se .sorted().limit((long) N).toArray()
sarà ottenere ottimizzato in alcuni casi (è dipendente di attuazione ma data attuale implementazione di Oracle, non mi aspetto di esso), ma in questo caso particolare, il flusso di fonti è un flusso di dimensione sconosciuta che rende le ottimizzazioni ancora meno probabili.
Se si desidera essere sicuri, è possibile adattare this solution per ottenere il numero massimo di n. in modo efficiente. Tutto quello che dovete fare è quello di invertire l'ordine:
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);
});
}
Quindi è possibile utilizzarlo come
int[] arr = maxValuesDescending(in.lines().mapToInt(Integer::parseInt), N).toArray();
Ma non sono tenuti a creare un array come si può utilizzare arbitrari IntStream
operazioni sul risultato . Questa soluzione manterrà al massimo i valori N
, ancor meno se ci sono duplicati in quanto contiene solo valori distinti e il loro conteggio.
Se sai che non avrà alcun valore 'Integer.MIN_VALUE', è possibile aggiungere un passaggio per mappare' io -> (-i) '. (La qualifica 'Integer.MIN_VALUE' è importante, dal momento che' Integer.MIN_VALUE == (- Integer.MIN_VALUE) '). – yshavit
Inoltre, sai se la combo del limite di ordinamento è ottimizzata? Perché se così non fosse, c'è una buona probabilità che 'sorted()' stia comunque andando a memorizzarli tutti in memoria, nel qual caso si può anche solo ottenere quell'array e leggere gli N elementi migliori. – yshavit
@yshavit Penso che tu abbia ragione circa la combo del limite di ordinamento, deve memorizzarlo in qualche contenitore intermedio – Aurumae