2011-04-18 2 views
0

J'ai une collection commeMise en œuvre du tri dans Vector

Vector<HashMap<String, String>> 

En fait, je me sers de ce que les éléments de liste de vue de la liste dans android.I utilisés SortedMap mais je n'ai pas un résultat correct. Je pense que c'est parce que la structure de HashMap est

hashMap.add("Name","value_of_name"); 
hashMap.add("Counts","value_of_counts"); 

Maintenant, j'ajouter à Vector.

Je souhaite trier l'élément vectoriel par la clé Name de hashMap. Je connais le Collection.sort et je peux le trier en utilisant les classes ArrayList et POJO. Mais je ne sais pas comment l'utiliser avec adapter de mon ListView

Comment puis-je trier des éléments. Et y a-t-il une meilleure solution (Concernant ma structure de données de collection, qui peut être utilisée avec un adaptateur facilement)?

+0

vous devrez être plus précis dans la description de votre problème. essayez-vous de trier le vecteur ou le contenu des hashmaps? Qu'avez-vous essayé jusqu'à présent? comment le résultat est-il censé être stocké? – Mat

+4

Je ne comprends pas, une carte de hachage peut avoir plusieurs clés. Quel est le critère pour qu'une carte de hachage soit placée avant une autre? – aioobe

+0

Un HashMap peut avoir beaucoup de clés (c'est tout le point), et ils pourraient même avoir exactement les mêmes clés, donc vous devez être plus précis sur la façon de trier le Vector –

Répondre

0

Si vous souhaitez trier les cartes dans le tableau, utilisez une implémentation SortedMap comme TreeMap ou ConcurrentSkipListMap. Cela prend un vecteur de HashMaps et renvoie un ArrayList (une collection non synchronisée et plus rapide que Vector) de SortedMaps.

public ArrayList<SortedMap<String, String>> sortMaps(Vector<HashMap<String, String> maps) { 
    ArrayList<TreeMap<String, String>> returnMaps = new ArrayList<TreeMap<String, String>>(); 
    for(HashMap<String, String> theMap : maps) { 
     // TreeMap is a sorted map and this will use the default String.compareTo 
     TreeMap<String, String> newMap = new TreeMap<String, String>(); 
     // put all the items from the HashMap into the TreeMap, which will autosort 
     newMap.putAll(theMap); 
     returnMaps.add(newMap); 
    } 
    return returnMaps; 
} 

Pour trier le vecteur par les premières touches (touches les plus bas, d'abord par ordre alphabétique) de la carte de hachage essayez ce qui suit avant la ligne de retour:

// this sorts the vector by first keys 
    Collections.sort(returnMaps, new Comparator<SortedMap<String,String>>() { 
     public int compare(SortedMap<String,String> a, HashMap<String,String> b) { 
      return a.firstKey().compareTo(b.firstKey()); 
     } 
    }); 

Ou si vous voulez trier dernière clé (clés les plus élevées, dernière par ordre alphabétique):

// this sorts the vector by first keys 
    Collections.sort(returnMaps, new Comparator<SortedMap<String,String>>() { 
     public int compare(SortedMap<String,String> a, HashMap<String,String> b) { 
      return a.lastKey().compareTo(b.lastKey()); 
     } 
    }); 

Pour retourner une carte triée de toutes les clés (se taper du pied sur les doublons):

public SortedMap<String, String> singledSortedMap(Vector<HashMap<String, String> maps) { 
    // this will end up with all the values, sorted by natural string ordering 
    SortedMap<String, String> returnMap = new TreeMap<String, String>(); 
    for(HashMap<String, String> theMap : maps) { 
     returnMap.putAll(theMap); 
    } 
    return returnMap; 
} 
1

Je ne suis pas certain de comprendre correctement. Cela va trier le vecteur sur une touche des cartes.

Collections.sort(yourVector, new Comparator<HashMap<String,String>>() { 
    public int compare(HashMap<String,String> a, HashMap<String,String> b) { 
     return a.get(yourKey).compareTo(b.get(yourKey)); 
    } 
}); 
+0

Comme dit aioobe, vous supposez une clé unique "yourKey" pour le hashmap? Quel est le point de la hashmap? – Jmoney38

+0

Je ne suis pas. Je suppose seulement que le tri est fait sur une clé particulière. –

2

Vous devez mettre en œuvre une Comparator<HashMap<String,String> > un et placer la logique de votre ordre de tri dans sa méthode compare.

+0

Comment ça va être? –

1

Avez-vous déjà pensé à jeter un coup d'œil aux collections dans le paquet java.util?

Vous auriez alors découvert que Treemap implémente déjà le tri d'arbres équilibré pour Comparable éléments, comme String est. Donc, pour que vos articles soient triés, il vous suffit de rééquilibrer votre HashMap avec , et tout le travail sera fait.

BTW qu'est-ce que ce vecteur fait ici? Ils sont tellement Java 1.1 (quinze ans, en d'autres termes)

0

Le meilleur moyen (le plus rapide) d'utiliser un TreeMap à la place. Si vous le fournissez avec le Comperator correct, tous les éléments du TreeMap seront triés.

La question importante: Pourquoi avez-vous un vecteur de HashMaps?

+0

Je ne peux pas modifier ma structure de données. Son exigence. –