2010-09-01 2 views
2

Possible en double:
Clearest way to combine two lists into a map (Java)?La meilleure façon de java de fusionner deux listes à une carte?

Étant donné ceci:

List<Integer> integers = new ArrayList<Integer>(); 
    List<String> strings = new ArrayList<String>(); 

    strings.add("One"); 
    strings.add("Two"); 
    strings.add("Three"); 

    integers.add(new Integer(1)); 
    integers.add(new Integer(2)); 
    integers.add(new Integer(3)); 

Quelle est la meilleure façon de fusionner ces listes dans une carte comme [ "One" => 1 , "Deux" => 2, "Trois" => 3]?

Merci pour toutes suggestions

+0

L'opération que vous faites référence, d'appariement des éléments également indexés de deux listes de taille égale, est généralement désigné comme une opération éclair dans le monde de la programmation fonctionnelle. – GaryF

+1

Dupliquer de http://stackoverflow.com/questions/1839668/clearest-way-to-combine-two-lists-into-a-map-java –

Répondre

12

Si l'on suppose que les deux listes sont de longueur égale et que les clés et les valeurs ont le même indice dans les deux listes, cela est une approche simple:

for (int i = 0; i < strings.size(); i++) { 
    map.put(strings.get(i), integers.get(i)); 
} 
+0

Merci, pensait qu'il pourrait y avoir une méthode quelque part dans la bibliothèque java fais-le, mais je suppose que c'est assez concis! – Chris

+0

J'espère que vous ne recevrez pas 'LinkedList's. (Mais si vous utilisez 'LinkedList', les performances sont probablement désactivées.) –

+0

Les itérateurs le rendraient-ils compatible LinkedList? – Chris

2

Quelque chose comme :

HashMap<String,Integer> hmap=new HashMap<String,Integer>(); 

for (int i=0; i<strings.size(); i++) { 
    hmap.put(strings.get(i),integers.get(i)); 
} 
5

ici en terre Scala, nous écrivions comme:

integers.zip(strings).toMap 

:-P

4
code

suggéré par Andreas ou Mikera est bien aussi longtemps que la mise en œuvre List que vous utilisez a une méthode get efficace. Il peut y avoir des cas où l'accès par index est plutôt cher (par exemple, LinkedList).

C'est pourquoi, en général, vous devriez préférer les itérateurs pour de telles procédures.

code:

Iterator<String> stringsItr = strings.iterator(); 
Iterator<Integer> integersItr = integers.iterator(); 
Map<String, Integer> map = new HashMap<String, Integer>(); 
while(stringsItr.hasNext() && integers.hasNext()) { 
    map.put(stringsItr.next(), integers.next()); 
} 
+0

Que faire si 'stringsItr.hasNext()' retourne 'true' et' integers.hasNext() 'retourne' false'? Aie. –

+0

@Noel: Aah, ça aurait vraiment dû être '&&'. Modification maintenant, merci de le notifier. :-) – missingfaktor