Wie sortierten Index zurück zur Karte für Sammlung Original-Index Ich bin Sortierung

StackOverflow https://stackoverflow.com/questions/206953

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine Sammlung bekommt (List ), die ich brauche, um die Suchergebnisse der links-rechts. Dieser Teil ist einfach. Dann möchte ich durch die Rectangles in ihrem Original , um iterieren, aber leicht ihren Index in der sortierten Sammlung finden. indexOf () wird nicht funktionieren, da ich eine Anzahl von gleichen Objekten hat. Ich kann es nicht helfen, das Gefühl sollte eine einfache Möglichkeit, dies zu tun.

War es hilfreich?

Lösung 2

Ich habe eine Lösung gefunden -. Aber vielleicht gibt es eine sauberere / optimalere einer da draußen

List<Rectangle> originalRects = ...;

/* record index of each rectangle object.
 * Using a hash map makes lookups efficient,
 * and using an IdentityHashMap means we lookup by object identity
 * not value.
 */
IdentityHashMap<Rectangle, Integer> originalIndices = new IdentityHashMap<Rectangle, Integer>();
for(int i=0; i<originalRects.size(); i++) {
    originalIndices.put(originalRects.get(i), i);
}

/* copy rectangle list */
List<Rectangle> sortedRects = new ArrayList<Rectangle>();
sortedRects.addAll(originalRects);

/* and sort */
Collections.sort(sortedRects, new LeftToRightComparator());

/* Loop through original list */
for(int i=0; i<sortedRects.size(); i++) {
    Rectangle rect = sortedRects.get(i);
    /* Lookup original index efficiently */
    int origIndex = originalIndices.get(rect);

    /* I know the original, and sorted indices plus the rectangle itself */
...

Andere Tipps

Wenn Sie nicht über Zehntausende von Objekten, können Sie einfach speichern sie in zwei getrennten Sammlungen, ein Original, ein sortiert. Denken Sie daran, dass die Collection-Klassen in Java nur speichern Referenzen auf Objekte, so dass dies dauert nicht so viel Speicher auf, als es scheinen mag.

Klonen, die Listen und Art einer von ihnen. zwei Referenzen des gleichen Objekts zu haben, ist auch keine Rolle, wird viel mit indexOf (), da die Zeiger auf das gleiche Objekt gleich sind und man kann zwischen ihnen nicht sagen. Wenn Sie zwei Objekte, die gleich sind, aber nicht identisch sind und Sie nicht möchten, zwischen ihnen unterscheiden, dann tun Sie da indexOf ein Problem haben () wird die gleiche Methode. In diesem Fall ist die beste Lösung könnte einfach in der Liste durchlaufen und überprüfen Sie die Objektidentität (==).

Eine andere Möglichkeit ist es, eine Reihe von Indizes zu sortieren, anstatt die ursprüngliche Liste der Sortierung. Das Array beginnt als Identitäts Array a [0] = 0, a [1] = 1, usw., verwenden dann einen benutzerdefinierte Komparator / Sortier ein Index-Array zu erhalten. nicht viel mehr Platz benötigen, da Sie nur einen zusätzlichen Integer-Array anstelle einer anderen Sammlung.

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