2017-10-19 24 views
0

Quelle est la meilleure façon d'obtenir le Kth plus grand élément dans un DoubleStream en java?Comment obtenir Kth plus grand élément d'un DoubleStream en Java

Je sais que nous pouvons faire .max(). GetDouble() pour obtenir l'élément le plus grand.

+2

Avez-vous essayé de le chercher? Il y a beaucoup de questions traitant de trouver le k-ème élément le plus important dans diverses structures de données. – Henry

+2

[Aucun code] (http://idownvotedbecau.se/nocode) et [aucune tentative] (http://idownvotedbecau.se/noattempt), veuillez consulter [ask]. – Alex

+0

Copie possible de [Comment trouver le kième élément le plus grand dans un tableau non trié de longueur n dans O (n)?] (Https://stackoverflow.com/questions/251781/how-to-find-the-kth-largest -element-in-an-unsorted-array-of-length-n-in-on) – geocar

Répondre

1
doubleStream.boxed() 
      .sorted(Comparator.reverseOrder()) 
      .skip(k - 1) 
      .findFirst() 
      .orElse(null); 

vous donnera la k e élément le plus grand, ou null s'il y a moins de k éléments dans le flux.

0

Triez le flux, transformez-le en tableau et récupérez l'élément sur array.length-k.

Exemple:

private static double getKth(DoubleStream ds, int k) { 
    double[] array = ds 
     .sorted() 
     .toArray(); 
    return array[array.length-k]; 
} 

Vous devez ajouter la validation pour vous assurer que k a une valeur légitime

+0

Ou utilisez skip et limite au lieu de '.toArray();' – c0der

+0

@ c0der esprit montrant du code? – alfasin

+0

Je vais essayer (je ne suis pas l'électeur descendant) – c0der

-1

Une fois que vous avez DoubleStream, faire sorted() dans l'ordre inverse (DESC). Puis limit(k) et trier ASC et prendre le first.

.boxed() 
.distinct() //in case you want to ignore repeating values 
.sorted(Comparator.reverseOrder()) 
.limit(k) 
.sorted() 
.findFirst()); 
+1

Il retournera le k-ème élément le plus petit au lieu du plus grand. – ZhekaKozlov

+1

si la liste a des doublons jusqu'au nième nombre supposons que nous voulons trouver le 2ème plus grand et le tableau est 2,1,6,6 en triant il donnera 6,6,2,1 et le 2ème donnera 6 mais ce n'est pas vrai –

+0

@xenteros Vous limitez 'k' les plus petits éléments – ZhekaKozlov

2
OptionalDouble kthLargest = stream 
     .map(i -> -i) // Trick to sort in reverse order 
     .sorted() 
     .distinct() // Remove duplicates 
     .map(i -> -i) 
     .skip(k - 1) 
     .findFirst(); 
+0

@Holger Stream peut contenir moins de 'k' éléments – ZhekaKozlov

+0

@Holger cette solution améliorerait-elle plus rapidement/plus de mémoire efficace que d'utiliser un flux encadré pour trier décroissant (qui pourrait être plus facile à lire)? –

+2

@Malte Hartwig: cela dépend de la taille du flux et de l'implémentation. AFAIK, en utilisant 'distinct()' avec l'implémentation actuelle, vous avez quand même la surcharge de boxe. Mais si vous avez vraiment besoin de cette opération pour être efficace, vous ne devriez utiliser ni l'un ni l'autre, mais plutôt faire quelque chose [comme ceci] (https://stackoverflow.com/q/5380568/2711488); c'est pareil pour les k éléments les plus petits ou les plus grands. – Holger