2017-01-04 1 views
-1

Wenn ich eine Arraylist habe, und ich möchte sowohl eine sortierte als auch unsortierte Version davon, wie kann ich es erreichen.Sammlungen sortieren nach einer Kopie eines Arraylists (um die ursprüngliche Reihenfolge zu behalten)

versucht, mit Kollektionen

ArrayList<Integer> someNumbers = new ArrayList<>(); 

wenn ich dann eine neue Arraylist = Somenumbers machen und es sortieren. Das Original wird auch sortiert?

ArrayList<Integer> sortedNumbers = someNumbers; 
Collections.sort(sortedNumbers); 

beide Liste wird sortiert.

Wie kann ich einfach erreichen, was ich versuche zu tun? (Holen Sie sich eine sortierte Kopie, und bewahren Sie das Original in seiner ursprünglichen Reihenfolge auf.)

Antwort

9

Wenn Sie ArrayList<Integer> sortedNumbers = someNumbers; tun, Sie sind nicht eine neue Liste erstellen zu sortieren. Sie weisen die Variable sortedNumbers grundsätzlich exakt der gleichen Liste zu, der someNumbers zugeordnet ist.

Um es zu beheben, können Sie eine neue Liste aus Ihrer anderen Liste erstellen. Wie folgt:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers); 
3

Sie müssen eine Kopie der Liste erstellen und sie dann sortieren, z.

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers); 
Collections.sort(sortedNumbers); 

Dieser verwendet ArrayList(java.util.Collection) Konstruktor

2

einfach das Array kopieren und die Kopie sortieren:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers); 
Collections.sort(sortedNumbers); 
2

Sie müssen die ArrayList zuerst kopieren, um zwei Versionen zu haben. Dann können Sie eine der beiden Arraylisten sortieren

ArrayList<Integer> someNumbers = ... 
ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers); 
Collections.sort(sortedNumbers); 
3

Der Grund, warum beide Listen sortiert bekommen, ist denn auch zuerst Sie eine new ArrayList() erstellen, können Sie dann überschreiben diese Instanz mit einem Verweis auf someNumbers. Wenn Sie also sortedNumbers sortieren, sortieren Sie die ursprüngliche Liste someNumbers.

Es gibt mehrere Möglichkeiten, wie Sie Ihr Ziel erreichen können:

ArrayList<Integer> sortedNumbers = new ArrayList<>(); 
sortedNumbers.addAll(someNumbers); 

Oder Sie können mithilfe des Copykonstruktor die gleiche in einem Schritt erreichen:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers); 
Verwandte Themen