web-dev-qa-db-fra.com

Comment obtenir de la valeur de LinkedHashMap basée sur un index et non sur une clé?

J'ai

LinkedHashMap<String, List<String>> hMap;

Je veux obtenir List<String> par position pas sur la touche.

Je ne veux pas utiliser itérer.

Existe-t-il un autre moyen d'obtenir une valeur basée sur un index?

43
MAC

Vous ne pouvez pas obtenir la valeur de Map en fonction de l'index, Maps ne fonctionne tout simplement pas de cette façon. Une solution de contournement consisterait à créer une nouvelle liste à partir de vos valeurs et à obtenir la valeur en fonction de l'index.

LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);
49
PermGenError
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
   return (List<String>) hMap.values().toArray()[index];
}
15
Kevin Bowersox

vous souhaiterez peut-être envisager d'utiliser une autre classe pour stocker vos données ou d'écrire une extension sur linkedHashMap. quelque chose comme

//this is pseudo code
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap{

HashMap<int,K> index;
int curr = 0;

    @Override
    public void add(K key,V val){
        super.add(key,val);
        index.add(curr++, key);
    }

    public V getindexed(int i){
        return super.get(index.get(i));
    }

}
12
schippi

Comme l'a dit Kevin Bowersox, c'est aussi simple que

List<String> result = (List<String>) hMap.values().toArray()[position];

Mais il convient de noter que cela sera toujours itérer en utilisant .toArray (). C'est une déclaration simple et je ne sais pas s'il en existe une avec de meilleures performances, mais sachez que la complexité n'est pas log (n) (comme l'accès indexé dans le cas de B *), mais seulement n. Étant donné que LinkedHashMap est basé sur LinkedList, il n’existe aucun moyen d’accéder aux éléments de manière aléatoire, mais uniquement dans un ordre séquentiel.

La conversion en liste est un mal inévitable, car .toArray () suit le concept archaïque de retourner Object au lieu d'un type de données générique.

Bien que cela ne soit peut-être pas le concept principal d'une carte, LinkedHashMap n'est pas qu'une carte. il étend HashMap et, en tant que classe extensible, il est parfaitement correct d’apporter des méthodes supplémentaires qui prennent en charge les particularités de cette classe.

7
makrom

Il n'y a pas directement DS dans l'API Java Collections standard pour fournir une carte indexée. Toutefois, les éléments suivants devraient vous permettre d’atteindre le résultat souhaité:

// An ordered map
Map<K, V> map = new LinkedHashMap<K, V>();
// To create indexed list, copy the references into an ArrayList (backed by an array)
List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet());
// Get the i'th term
<Map.Entry<K,V>> entry = indexedList.get(index);
K key = entry.getKey();
V value = entry.getValue();

Vous pouvez toujours vouloir conserver les préoccupations de persistance des données dans la carte séparément de la récupération.

Mise à jour: Ou utilisez LinkedMap de Apache Commons.

3
Neel