17 Stimmen

Behält die von Arrays.asList zurückgegebene Liste die gleiche Reihenfolge bei wie die ursprüngliche Array-Sammlung?

Ich habe eine ArrayList, die ich über mehrere Male iteriert, und es sieht aus wie es nicht die Reihenfolge der Iteration beibehalten wird. Ich schaute tiefer, und es scheint, dass die benutzerdefinierte Iterator-Tag, die für diese Iteration (von jemand anderem) geschrieben wurde, ist zunächst die übergebene ArrayList und mit Arrays.asList, um es zu einem Object[] Sammlung vor Iteration zu überbrücken. Ist die Reihenfolge der Iteration verloren gehen? Ist das mit Arrays.asList erwartet?

EDIT:

Im Folgenden wird beschrieben, was der Vorgang mit der ursprünglichen Sammlung macht, die an das Iterator-Tag übergeben wurde:

if(collection.getClass().isArray()) {
    iterator = Arrays.asList((Object[]) collection).iterator();
} else if(collection instanceof Collection) {
    iterator = ((Collection) collection).iterator();
} else if(collection instanceof Iterator) {
    iterator = (Iterator) collection;
} else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

11voto

Powerlord Punkte 84404

Die Liste wird immer noch durch das ursprüngliche Array unterstützt, so dass die Elemente in der gleichen Reihenfolge wie im Array erscheinen sollten.

Beachten Sie auch, dass asList eine generische Methode ist, so dass Arrays.asList(T[]) gibt eine List<T> .

Was die andere Richtung betrifft, List 's toArray

Gibt ein Array zurück, das alle Elemente in dieser Liste in der richtigen Reihenfolge (vom ersten bis zum letzten Element).

Es gibt zwei toArray-Methoden. Die erste gibt ein Object[] die zweite nimmt ein Array als Argument und gibt ein Array desselben Typs zurück.

So etwas ist nicht ungewöhnlich, wenn man ein Array von String als Beispiel verwendet:

String[] y = x.toArray(new String[0]);

(Dieses Beispiel stammt aus der JavaDoc para List<E> )

3voto

Zach L Punkte 15742

Möglicherweise wird die Iteration unterbrochen, wenn collection ist eine Karte

 else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

Wenn collection ist speziell ein HashMap wird die Reihenfolge der Elemente der Sammlung tatsächlich über den Haufen geworfen.

Wenn collection ist eine TreeMap es sollte die Reihenfolge der Sammlung auf der Grundlage der Sortierung beibehalten. Wie auch immer, wenn man eine TreeMap aus einem Array von Vergleichbar Objekte, Sie sollte nicht erwarten, dass das Array und die TreeMap die gleiche Reihenfolge haben, da die TreeMap den Inhalt des Arrays sortieren wird.

Und Sie könnten auch einige andere Collection die Ordnung durcheinanderbringt wie HashSet , PriorityQueue , usw.

Wenn jedoch collection ist nie eine Karte und immer ein Array, Arrays.asList sollte die Ordnung aufrechtzuerhalten. Meine beste Vermutung ist, dass Ihre Probleme liegt entweder außerhalb Ihres Codeschnipsels, oder in einem der Fälle neben wo Sie ein Array übergeben.

0voto

Peter Lawrey Punkte 511323

Sie können dies allgemeiner gestalten und ersetzen Collection con Iterable .

} else if(collection instanceof Iterable) {
    iterator = ((Iterable) collection).iterator()

Hinweis: Primitive Arrays wie int[].class.isArray() == true aber sie können nicht geworfen werden mit Object[]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X