2011-10-20 3 views
0

j'ai un vecteur de hashmap et HashMap contient différents types de données:comment trier un vecteur de hashmaps

Vector<HashMap<String, Object>> theVector= new Vector<HashMap<String, Object>>(); 

theResults contient ce HashMap:

HashMap<String, Object> theHashMap= new HashMap<String, Object>(); 

theHashMap a ces données: (prétendre qu'il s'agit d'une boucle for)

//1st set 

theHashMap.put("BLDG_ID", 111); //int 
theHashMap.put("EMP_NAME", "AAA"); //String 
theHashMap.put("FLAG", true); //boolean 

theVector.add(theHashMap); 

//2nd set 

theHashMap.put("BLDG_ID", 222); //int 
theHashMap.put("EMP_NAME", "BBB"); //String 
theHashMap.put("FLAG", false); //boolean 

theVector.add(theHashMap); 

//2nd set<br> 
theHashMap.put("BLDG_ID", 111); //int 
theHashMap.put("EMP_NAME", "CCC"); //String 
theHashMap.put("FLAG", false); //boolean 

theVector.add(theHashMap); 

Je veux trier le contenu de mon vecteur de HashMap selon BLDG_ID de sorte que lorsque j'afficher les données qu'il ressemblerait

BLDG_ID || EMP_NAME 
111  || AAA 
111  || CCC 
222  || BBB 

Comment puis-je faire cela?

+0

mon > et < ont été dépouillés voici la déclaration de theVector nouveau '' vecteur < HashMapvString, objet > > theVector = new Vector < HashMap < String, Object > >(); –

+0

S'il vous plaît apprendre à utiliser Markdown: http://stackoverflow.com/editing-help – NullUserException

+0

argh. mes < and > ont été supprimés voici la déclaration pour theVector encore '' Vecteur > theVector = nouveau Vecteur >(); HashMap theHashMap = new HashMap (); –

Répondre

1

Mettre en œuvre une coutume Comparator<Map<String, Object>>, puis appelez Collections.sort

Note: Vous pouvez utiliser ArrayList au lieu de Vector.

+0

Salut puce, je ne suis pas sûr de comprendre ce que vous entendez par comparateur personnalisé ... cela vous dérangerait-il de donner un exemple? –

+0

Jetez un oeil à la réponse de Bhesh Gurung. Il a donné un échantillon d'un tel comparateur. – Puce

2

Je pense que vous feriez mieux de faire quelque chose comme ceci: Au lieu d'utiliser un hashmap pour vos valeurs, faites juste une classe. Ensuite, vous aurez compile time checking sur vos opérations, ce qui aidera à prévenir les erreurs sur la route.

class Employee implements Comparable<Employee> { 
    int buildingId; 
    String name; 
    boolean flag; 

    Employee(int b, String n, boolean f) { 
     buildingId = b; 
     name = n; 
     flag = f; 
    } 

    public int compareTo(Employee other) { 
     if(other.buildingId == this.buildingId) 
      return name.compareTo(other.name); 
     return buildingId - other.buildingId; // potential for overflow, be careful 
    } 

} 

Ensuite, vous pouvez simplement trier le vecteur en utilisant le type que vous voulez. Si vous utilisez ArrayList (la forme moderne de Vector) vous pouvez utiliser Collections.sort(myList);

List<Employee> emps = new ArrayList<Employee>(); 
emps.add(new Employee(111,"AAA",true)); 
emps.add(new Employee(111,"CCC",false)); 
emps.add(new Employee(111,"BBB",false)); 

Collections.sort(emps); 
System.out.println("Building Id,Employee Name"); 
for(Employee emp : emps) System.out.println(emp.getCSV()); // or however you want to format it 
+0

+1: Un autre cas de [dénégation d'objet] (http://stackoverflow.com/questions/3725703/how-to-store-more-than-one-string-in-a-map). –

+0

malheureusement, je ne peux pas changer le hashmap parce que d'autres processus ont besoin de cet objet –

+0

@Joachim qui est un joyau d'un terme! – corsiKa

1
List<Map<String, Object>> vector = new Vector<Map<String, Object>>(); 

Collections.sort(vector, new Comparator<Map<String, Object>>() { 
    @Override 
    public int compare(Map<String, Object> map1, Map<String, Object> map2) { 
     return ((Integer) map1.get("BLDG_ID")).compareTo((Integer) map2.get("BLDG_ID"))); 
    }    
}); 

Mise à jour: Pour votre code:

Après la "dernière"

theVector.add(theHashMap); 

add le suivant

Collections.sort(theVector, new Comparator<HashMap<String, Object>>() { 
     @Override 
     public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) { 
      return ((Integer) o1.get("BLDG_ID")).compareTo((Integer) o2.get("BLDG_ID")); 
     }    
    }); 
+0

Utilisez l'interface (Map) au lieu de l'implémentation (HashMap). D'ailleurs je pense que le deuxième paramètre générique devrait être Object. – Puce

+0

@Puce: modifié. Merci pour la suggestion. –

+0

merci Bhesh Gurung & puce, pardon mon ignorance mais comment puis-je utiliser le code ci-dessus compte tenu de mon exemple de données? Dois-je ajouter ce comparateur personnalisé dans la même méthode où j'ai le theVector.add (theHashMap); et theHashMap.put ("BLDG_ID", 222); // int
, etc? merci pour votre patience –

Questions connexes