Buradaki hile "geri" yi tanımlamaktadır. Listeyi yerinde değiştirebilir, ters sırada bir kopya oluşturabilir veya ters sırada bir görünüm oluşturabilirsiniz.
Basit yolu, sezgisel konuşma vardır Collections.reverse
:
Collections.reverse(myList);
Bu yöntem , listeyi yerinde değiştirir . Yani, Collections.reverse
listeyi alır ve öğelerinin üzerine yazar ve geri döndürülmemiş bir kopya bırakmaz. Bu, bazı kullanım durumları için uygundur, ancak diğerleri için uygun değildir; ayrıca listenin değiştirilebilir olduğunu varsayar. Eğer bu kabul edilebilirse, iyiyiz.
Değilse, ters sırayla bir kopya oluşturulabilir :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Bu yaklaşım işe yarar, ancak listenin iki kez yinelenmesini gerektirir. Copy yapıcısı ( new ArrayList<>(list)
) liste üzerinde yinelenir ve öyle yapar Collections.reverse
. Çok eğimliysek, bu yöntemi yalnızca bir kez yinelemek için yeniden yazabiliriz:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
Bu daha verimlidir, ancak daha ayrıntılıdır.
Alternatif olarak, bazı kişilerin yukarıdakilerden daha özlü ve okunaklı bulduğu Java 8'in stream
API'sını kullanmak için yukarıdakileri yeniden yazabiliriz :
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
nb. O Collectors.toList()
sonuç listesi hakkında çok az garanti vermez. Sonucun ArrayList olarak geri gelmesini sağlamak istiyorsanız Collectors.toCollection(ArrayList::new)
bunun yerine kullanın.
Üçüncü seçenek, görünümü ters sırayla oluşturmaktır . Bu daha karmaşık bir çözümdür ve daha fazla okumaya / kendi sorusuna değer. Guava'nın Listeleri # ters yöntemi geçerli bir başlangıç noktasıdır.
"En basit" bir uygulamayı seçmek okuyucu için bir alıştırma olarak bırakılmıştır.