2010-10-01 4 views

Antwort

9
// create the thing to store the sub lists 
Map<Integer, List<MyObject>> subs = new HashMap<Integer, List<MyObject>>(); 

// iterate through your objects 
for(MyObject o : list){ 

    // fetch the list for this object's id 
    List<MyObject> temp = subs.get(o.getId()); 

    if(temp == null){ 
     // if the list is null we haven't seen an 
     // object with this id before, so create 
     // a new list 
     temp = new ArrayList<MyObject>(); 

     // and add it to the map 
     subs.put(o.getId(), temp); 
    } 

    // whether we got the list from the map 
    // or made a new one we need to add our 
    // object. 
    temp.add(o); 
} 
+0

danke diese Lösung sieht elegant für mich aus. – james

+1

+1 - für das korrekte Einrücken des Codes und das Hinzufügen von Kommentaren –

2

Schleife durch die Elemente, überprüfen Sie ihre id Werte, und legen Sie sie in eine Hashtable mit id als Schlüssel. Das ist O (N), das ist so effizient, wie du es bekommen wirst.

+0

Und was ist mit dem Wert? –

+0

@Kirk - Das hängt davon ab, wie das OP es verwenden würde. Bei einem solchen trivialen Objekt kann es sinnvoll sein, wenn 'name' der Wert ist, aber in vielen Situationen wäre es sinnvoller, wenn der Wert das Objekt selbst ist: Es ist keine Frage, die Sie ohne weiteren Kontext beantworten können. –

1
ArrayList<MyObject> list=new ArrayList<MyObject>(); 
//fill Objects.. 
HashMap<Integer,ArrayList<MyObject>> hash=new HashMap<Integer,ArrayList<MyObject>>(); 
for(MyObject elem:list)//iterate the list 
{ 
ArrayList<MyObject> tmp=null; //temporary variable 
if((tmp=hash.get(elem.getId()))==null) // check if id already present in map 
{ 
    tmp=new ArrayList<MyObject>(); 
    hash.put(elem.getId(),tmp); //if not put a new array list 
} 
names.add(elem); //if present add the name to arraylist 
} 
+0

+1, der Wert ist eine Liste. –

+0

Namen werden in dieser Lösung niemals zu einem Nullwert, wenn Sie eine neue ArrayList hinzufügen müssen. –

+0

@Mark: Ich habe den Code nicht getestet.Vielen Dank. – Emil

8

Mit Guava:

ListMultimap<Integer, MyObject> myObjectsById = Multimaps.index(myObjects, 
    new Function<MyObject, Integer>() { 
     public Integer apply(MyObject myObject) { 
     return myObject.id; 
     } 
    }); 
+1

Oder, wenn Sie Java 8 verwenden: ListMultimap myObjectsById = Multimaps.index (myObjects, MyObject :: getId); Aber dann kannst du Guava auch ganz überspringen und Damien O'Reillys Antwort benutzen –

2

Verwendung von JDK 1.8:

List<MyObject> objects= new ArrayList(); 
Map<Integer, List<MyObject>> obejctMap = new HashMap(); 
objects.stream().map(MyObject::getId).distinct().forEach(id -> obejctMap .put(id, 
       objects.stream().filter(object -> id.equals(object.getId())).collect(Collectors.toList()))); 
3

Wenn Sie JDK verwenden 1.8, können Sie eine elegante Lösung wie verwenden:

Map<Integer, List<MyObject>> myObjectsPerId = 
    myObjects.stream().collect(Collectors.groupingBy(MyObject::getId)); 
Verwandte Themen