2010-09-27 6 views
2

J'ai une page qui reçoit un ArrayList <Document> où chaque document a une propriété appelée type.Java Mapping ArrayList à HashMap

Je ne connais pas le nombre de types ou de documents uniques.

Je veux trier cette ArrayList dans un type HashMap <, document [] > mais j'ai du mal à comprendre.

Certains pseudo-code aimerait comme

for (int i = 0; i < documents.size(); i++) 
{ 
    if there is an array for documents[i].type 
    add to this array 
    else create a new array for this type 
    add document[i].type and the array of documents with matching type to the hashmap 
} 

Je sais que c'est la mauvaise approche et clairement ne fonctionnera pas. Je suis ouvert à toutes suggestions.

Merci

Répondre

8
// create the map to store stuff, note I'm using a List instead of an array 
// in my opinion it's a bit cleaner 
Map<String, List<Document>> map = new HashMap<String, List<Document>>(); 

// now iterate through each document 
for(Document d : documents){ 

    // check to see if this type is already known 
    List<Document> list = map.get(d.type); 

    if(list == null){ 
     // list is null when it wasn't found in the map 
     // this is a new type, create a new list 
     list = new ArrayList<Document>(); 

     // store the list in the map 
     map.put(d.type, list); 
    } 

    // finally, whether we got a hit or a miss, we want 
    // to add this document to the list for this type 
    list.add(d); 
} 
+0

+1 pour ajouter des commentaires utiles – Ibrahim

2

je pense plutôt que le tri par type, le terme que vous recherchez est indexation par type. Guava L'interface Multimap est conçue pour mapper des clés à plusieurs valeurs sans avoir à gérer les collections de valeurs. En particulier, Guava a une méthode qui est conçu pour faire exactement ce que vous essayez de faire:

List<Document> documents = ... 
ImmutableListMultimap<Type, Document> typeIndex = Multimaps.index(documents, 
    new Function<Document, Type>() { 
     public Type apply(Document input) { 
     return input.getType(); 
     } 
    }); 

for(Type type : typeIndex.keySet()) { 
    ImmutableList<Document> documentsWithType = typeIndex.get(type); 
    ... 
} 

C'est à peu près la même chose que faire:

ListMultimap<Type, Document> typeIndex = ArrayListMultimap.create(); 
for(Document document : documents) { 
    typeIndex.put(document.getType(), document); 
} 

sauf que le multimap résultant est immuable . Notez également que ce qui précède est presque exactement équivalent à l'exemple de Mark.