Wie sortierten Index zurück zur Karte für Sammlung Original-Index Ich bin Sortierung
-
03-07-2019 - |
Frage
Ich habe eine Sammlung bekommt (List
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.