Question Comment sélectionner les N premiers éléments dans Java TreeMap?


Étant donné cette carte

SortedMap<Integer, String> myMap = new TreeMap<Integer, String>();

Au lieu d'une boucle for, existe-t-il une fonction utilitaire permettant de copier les N premiers éléments sur une carte de destination?


11
2018-04-13 11:21


origine


Réponses:


Peut-être, mais pas dans le cadre de l'API Java standard. Et: l'utilitaire utiliserait une boucle à l'intérieur.

Donc, vous aurez besoin d'une boucle, mais vous pouvez créer votre propre "utilitaire" en procédant tout en utilisant une méthode statique dans une classe d'utilitaire:

public static SortedMap<K,V> putFirstEntries(int max, SortedMap<K,V> source) {
  int count = 0;
  TreeMap<K,V> target = new TreeMap<K,V>();
  for (Map.Entry<K,V> entry:source.entrySet()) {
     if (count >= max) break;

     target.put(entry.getKey(), entry.getValue());
     count++;
  }
  return target;
}

La complexité est toujours O (n) (je doute que l'on puisse atteindre O (1)) mais vous l'utilisez comme un outil sans "voir" la boucle:

SortedMap<Integer, String> firstFive = Util.putFirstEntries(5, sourceMap);

6
2018-04-13 11:28



Utiliser la puissance de Java 8+:

TreeMap<Integer, String> myNewMap = myMap.entrySet().stream()
    .limit(3)
    .collect(TreeMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll);

7
2018-02-08 22:43



Il y a SortedMap.headMap() Cependant, vous devrez passer une clé pour que l'élément atteigne. Vous pouvez itérer N éléments sur Map.keySet() pour le trouver, par exemple:

Integer toKey = null;
int i = 0;
for (Integer key : myMap.keySet()) {
    if (i++ == N) {
        toKey = key;
        break;
    }
}

// be careful that toKey isn't null because N is < 0 or >= myMap.size()
SortedMap<Integer, String> copyMap = myMap.headMap(toKey);

6
2018-04-13 11:25



Vous pouvez utiliser la fonction putAll (Map t) pour copier les éléments de la carte sur la carte spécifiée. Toutefois, elle copie tous les éléments. Vous ne pouvez pas copier un nombre fixe d'éléments.

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Map.html#putAll%28java.util.Map%29


0
2018-04-13 11:29



Vous pouvez également utiliser un itérateur ordoré pour obtenir les premiers x enregistrements, par exemple:

Iterator<Integer> iterator = myMap.descendingKeySet().iterator();

0
2018-01-31 10:54