Frage

Ich möchte eine Sammlung von Objekten speichern, die basierend auf einem Wert verkeilt sind sie vertreten. Diese Tasten können wiederholt werden. z.

 [4] => Bob
 [5] => Mary
 [5] => Sue
 [9] => Steve
[10] => Jason
[10] => Michelle

Im Grunde möchte ich Schleife durch diesen und Blick auf jede Taste und sagen: „ist es ein anderes Objekt (Person in diesem Fall), dessen Schlüssel in 1 aus dem aktuellen Schlüssel? Wenn ja, passen sie auf und entfernen Sie sie aus die Sammlung." Ich bin über den Wert „1“ in dem Beispiel zu Iterierte gehen, bis die Sammlung leer ist (oder nur ein Objekt verbleibenden Szenarien ungerade).

Ich bin die Art und Weise nicht davon überzeugt, ich versuche, um dies zu realisieren ist die beste Art und Weise, so dass ich auch auf dem Feedback offen bin.

War es hilfreich?

Lösung

Sie möchten ein Multimap . Guava bietet diese Schnittstelle und verschiedene Subinterfaces wie ListMultimap, SetMultimap und SortedSetMultimap in Abhängigkeit davon, welche Art von Sammlung Sie Werte wollen gespeichert werden. damit können selbst dann verschiedene Implementierungen wie ArrayListMultimap und HashMultimap, sowie verschiedene weitere Hilfsmittel für mit ihnen Gebrauch in Multimaps .

Der traditionelle Weg, dies in Java zu tun, ist so etwas wie Map<K, List<V>>, Map<K, Set<V>> etc., aber die Werte Sammlungen beibehalten ist mühsam und verschiedene Operationen, die einfach (wie nur darum, einen Wert für einen Schlüssel) sein sollte, sind viel komplizierter als sie sein müssen.

Multimap sollte als eine Datenstruktur, die speziell konzipiert, um mehrere Werte eine einzelne Taste zugeordnet modellieren (im Gegensatz zu Map). Da macht es Operationen so einfach, wie man es erwarten würde:

ListMultimap<Integer, String> m = ArrayListMultimap.create();
m.put(4, "Bob");
m.put(5, "Mary");
m.put(5, "Sue");
...

for (String name : m.get(5)) { ... } // iterates ["Mary", "Sue"]

Wenn Sie den gleichen Wert, um sicherzustellen, wollte nicht auf einen einzigen Schlüssel zugeordnet wird zweimal und kümmern sich nicht um die Reihenfolge, in die Werte sind, können Sie eine SetMultimap anstelle eines ListMultimap verwenden, etc.

Ich bin mir nicht sicher, was Sie so weit wie bedeuten „ist es ein weiteres Ziel, dessen Schlüssel innerhalb von 1 aus dem aktuellen Schlüssel? Wenn ja, passen sie auf, und entfernen Sie sie aus der Sammlung.“ Aber wenn ich es richtig zu lesen, können Sie etwas tun könnten:

for (Integer key : m.keySet()) {
  Collection<String> people = m.get(key);
  Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none
  ...
}

Alternativ können Sie etwas mit einem TreeMultimap<Integer, String> tun, die beide ihren Schlüsselsatz und Wert haben wird Sätze sortiert.

Andere Tipps

Wie wärs mit einem Map<Integer, List<String>>, in einer Art kollisionsvermeidenden Art und Weise. Es wäre Ihr Datensatz ändern aussehen:

 [4] => [Bob]
 [5] => [Mary, Sue]
 [9] => [Steve]
[10] => [Jason, Michelle]

würden Sie haben Ihre Iterator-Code ein wenig ändern. Sie würden die Indizes der List Elemente als „Schlüssel“, und natürlich verwenden müssten Sie Logik hinzufügen, um Ihre Map mit leeren Listen zu initialisieren oder stellen Sie sicher, Ihre Map Werte für null zu überprüfen. Es wird eine Art davon abhängen, wie Sie Ihre Map erzeugen.

Was ist so etwas wie:

IDictionary<int,IList<Person>> 

Ich habe den Server-Betreiber, ich die Business-Logik nicht zu 100% folgen, aber wenn Sie mehrere Werte für einen einzelnen Schlüssel haben können, so etwas wie dies sollte es unterstützen.

- Bearbeiten - Ignorieren Sie diese - es wurde mir darauf hingewiesen, dass dies als eine Java-Frage markiert wurde. Daher ist die Antwort mit:

Map<Integer, List<String>>

ist viel besser geeignet.

Vielleicht nur so etwas wie: Liste, wo die CustomObject Ihre Schlüssel und Wert hat, und Sie sortieren die Liste nach dem Schlüssel.

Da es klingt wie Sie sie in der Reihenfolge verarbeiten, ich glaube, eine Karte könnte zu viel des Guten, da Sie iterieren über die Tasten, um möchte und Entfernen von Elementen in Paaren sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top