Ich habe eine Liste von MyObjects ... MyObject {Int-ID, String-Name}. Jetzt möchte ich die Liste in Unterlisten aufteilen, die identische "ID" -Werte haben, kann jemand einen effizienten Ansatz dafür vorschlagen.Teilen Sie eine Java-Sammlung in Sub-Sammlungen basierend auf einer Objekteigenschaft
Antwort
// 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);
}
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.
Und was ist mit dem Wert? –
@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. –
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
}
+1, der Wert ist eine Liste. –
Namen werden in dieser Lösung niemals zu einem Nullwert, wenn Sie eine neue ArrayList hinzufügen müssen. –
@Mark: Ich habe den Code nicht getestet.Vielen Dank. – Emil
Mit Guava:
ListMultimap<Integer, MyObject> myObjectsById = Multimaps.index(myObjects,
new Function<MyObject, Integer>() {
public Integer apply(MyObject myObject) {
return myObject.id;
}
});
Oder, wenn Sie Java 8 verwenden: ListMultimap
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())));
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));
- 1. merge Objekte in einer bestimmten Liste basierend auf Objekteigenschaft
- 2. Teilen einer HashMap basierend auf Werten in der Zeichenfolge
- 3. Wie eine Zeichenfolge teilen, basierend auf mehreren Kriterien in Ruby
- 4. Redshift - Teilen einer Tabelle basierend auf einem Spaltenwert
- 5. WPF MenüItem auf ContextMenu basierend auf Objekteigenschaft ausblenden
- 6. Bedingt eine Objekteigenschaft festlegen
- 7. Wie fügen Sie in einer Objekteigenschaft basierend auf der Anzahl der Ziffern in einer Zahl mehr hinzu?
- 8. Teilen einer verketteten Datei basierend auf Header-Text
- 9. Teilen Sie einen großen Datenrahmen in eine Liste von Datenrahmen basierend auf gemeinsamen Wert in Spalte
- 10. R: Zeitreihendaten basierend auf Bedingungen teilen
- 11. Eingabezeichenfolge basierend auf Leerzeichen und Kommas teilen
- 12. Teilen Sie eine Zeichenfolge auf einer Zeichenfolge nicht ein Zeichen
- 13. Eine Spalte horizontal in mehrere Spalten basierend auf einem gemeinsamen Wert in einer anderen Spalte teilen
- 14. Legen Sie eine Eigenschaft in WiX basierend auf einer Bedingung
- 15. So teilen Sie eine Textzeile basierend auf dem Begrenzer ';' in mehrere Spalten in Unix?
- 16. Überprüfen einer Objekteigenschaft in LHS
- 17. Teilen von Spaltenwerten basierend auf anderen Spaltenwerten
- 18. Zugriff auf eine Objekteigenschaft durch Schlüssel
- 19. Wie NSArray mit Prädikat auf eine Objekteigenschaft
- 20. Teilen Sie eine Zeichenfolge basierend auf Muster in Java - Großbuchstaben und Zahlen
- 21. Teilen Sie eine Liste von zwei Tupeln basierend auf den Elementen in der zweiten Dimension
- 22. Teilen Sie eine Sammlung in Teile basierend auf dem Zustand mit LINQ?
- 23. Aktualisieren einer Objekteigenschaft JavaScript
- 24. Überprüfen auf verschachtelte Objekteigenschaft
- 25. Lenker binden eine dynamische Objekteigenschaft
- 26. Wie kann ich Zeilen basierend auf Zeichen in Python teilen?
- 27. Gibt es eine Möglichkeit, einer Objekteigenschaft eine mehrzeilige Zeichenfolge zuzuweisen?
- 28. Wie kann ich eine Zeichenfolge basierend auf einer Kombination von Zeichen teilen?
- 29. Teilen Sie eine Spalte in R
- 30. Schreiben Sie eine SQL-Löschung basierend auf einer Select-Anweisung
danke diese Lösung sieht elegant für mich aus. – james
+1 - für das korrekte Einrücken des Codes und das Hinzufügen von Kommentaren –