2015-02-18 13 views

risposta

13

Come altre risposte, è necessario utilizzare una struttura come java.util.LinkedHashMap. LinkedHashMap mantiene le chiavi internamente utilizzando uno LinkedEntrySet, questo non fornisce formalmente l'ordine, ma itera nell'ordine di inserimento utilizzato.

Se si passa il Map.keySet() in un'implementazione elenco si può fare uso del metodo List.indexOf(Object), senza dover scrivere del codice aggiuntivo nell'altra risposta.

Map<String, Integer> map = new LinkedHashMap<String, Integer>(); 
map.put("Audi", 3); 
map.put("BMW", 5); 
map.put("Vauxhall", 7); 

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Set to List 

// BOOM ! 

System.out.println(indexes.indexOf("Audi"));  // ==> 0 
System.out.println(indexes.indexOf("BMW"));  // ==> 1 
System.out.println(indexes.indexOf("Vauxhall")); // ==> 2 
2

Non è possibile. Da HashMap JavaDocs:

Implementazione basata su tabella hash dell'interfaccia Mappa. Questa implementazione fornisce tutte le operazioni opzionali della mappa e consente valori nulli e la chiave nulla. (La classe HashMap è approssimativamente equivalente a Hashtable, tranne che non è sincronizzata e consente null.) Questa classe non fornisce garanzie sull'ordine della mappa; in particolare, non garantisce che l'ordine rimanga costante nel tempo.

Quindi, l'ordine può variare tra le iterazioni. Se è necessario per preservare l'ordine è possibile dare un'occhiata a LinkedHashMap

Dal LinkedHashMap JavaDocs:

tabella di hash e l'attuazione lista collegata dell'interfaccia Map, con ordine di iterazione prevedibile. Questa implementazione differisce da HashMap in quanto mantiene una lista doppiamente collegata che attraversa tutte le sue voci. Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserimento).

Quindi, per trovare la posizione chiave è necessario in pratica ripetere i tasti e contare la posizione del tasto che si sta cercando.

Nota a margine, questo potrebbe non essere il miglior utilizzo del tipo di dati Map. Credo che se hai davvero bisogno della posizione dovresti usare qualche tipo di List (ad esempio ArrayList) che in realtà conserva l'ordine e puoi utilizzare il metodo get per recuperare gli elementi per un determinato indice.

+0

Grazie. Ho guardato qui: http: //www.tutorialspoint.com/java/java_linkedhashmap_class.htm ma hm ... non mi mostra come posso ottenere la posizione di un elemento. Puoi darmi un piccolo esempio? – aNNgeL0

2

Non è possibile. Le chiavi su una mappa e una HashMap non sono ordinate. Dovrai utilizzare una struttura che mantenga l'ordine, ad esempio LinkedHashMap.

Si noti che LinkedHashMap non fornisce un metodo che ottiene le chiavi in ​​base alla posizione, quindi questo è appropriato solo se si sta per utilizzare un iteratore.

L'alternativa è quella di creare una seconda mappa che mappa dalla chiave per la posizione Integer, e aggiungere ad essa come si va avanti:

Map<String, Integer> indexMap = new HashMap<String, Integer>(); 
indexMap.put("Audi", 0); 
indexMap.put("BMW", 1); 

Per una soluzione più elegante, potrebbe essere necessario dare più informazioni su quello che stai facendo.

+0

Ho due file. In uno di essi ho dei nomi e nell'altro ho dei numeri. Le linee sono correlate. Se ho sulla prima riga del primo file "John" e "1000" sulla prima riga dell'altro file, significa che John ha 1000 $. Voglio collegarli in qualche modo, quindi posso ordinarli in base ai numeri. – aNNgeL0

Problemi correlati