5つの異なる方法でJavaのArrayListを反転します
の中に 前の投稿、方法について説明しました 所定の位置に Javaでリストを逆にします。この投稿では、 ArrayList
Javaでは、元のリストの要素の順序を変更せずに、逆の順序でコピーを作成します。指定されたリストは変更可能である場合とそうでない場合がありますが、返されるリストは変更可能である必要があります。
1.Guavaライブラリの使用
Guava’s Lists.reverse()
メソッドは、指定されたリストのビューを逆の順序で作成します。元のリストは返されたリストを裏付けるため、返されたリストの変更はこのリストに反映され、その逆も同様です。
新しいものを作成することでこれを回避できます ArrayList
以下に示すように、返されたリストからのインスタンス:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Arrays; import java.util.List; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { return new ArrayList<>(Lists.reverse(list)); } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
2.使用する Collections.reverse()
方法
私たちは、 Collections.reverse()
メソッドは、リストをインプレースで変更します。元のリストのコピーを作成してから、 reverse()
元のリストではなく、コピーのメソッド。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { List<T> reverse = new ArrayList<>(list); Collections.reverse(reverse); return reverse; } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
これは、Java8以降で使用する別の方法です。 Collections.reverse()
ストリームと一緒に、そして Collectors.collectingAndThen()
逆の順序で要素を収集するメソッド:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { return list.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(ArrayList::new), lst -> { Collections.reverse(lst); return lst.stream(); } )).collect(Collectors.toCollection(ArrayList::new)); } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
3.Java8の使用
Java8ストリームを使用してリストを逆にすることもできます。アイデアは、リストのすべての有効なインデックスのストリームを逆の順序で取得し、各インデックスをリスト内のその値にマップし、最後に要素を収集することです。 ArrayList
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.ArrayList; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { return IntStream.range(0, list.size()) .map(i -> (list.size() - 1 - i)) // IntStream .mapToObj(list::get) // Stream<T> .collect(Collectors.toCollection(ArrayList::new)); } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
上記のユーティリティメソッドの短縮バージョンは次のとおりです。
1 2 3 4 5 6 |
public static <T> List<T> reverseList(List<T> list) { return IntStream.range(0, list.size()) .mapToObj(i -> list.get(list.size() - 1 - i)) .collect(Collectors.toCollection(ArrayList::new)); } |
4.拡張 AbstractList
Class
AbstractList クラスは、の骨格実装を提供します List
インターフェース。アイデアは、このクラスを拡張し、 get()
, set()
, remove()
、などのメソッド。逆リストのように動作する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import java.util.AbstractList; import java.util.ArrayList; import java.util.Arrays; import java.util.List; //Javaで`ArrayList`を逆にするプログラム class Reverse<T> extends AbstractList<T> { private List<T> list; //コンストラクタ private Reverse(List<T> list) { //元のリストが影響を受けないように、新しいインスタンスを作成します this.list = new ArrayList<>(list); } public static <T> List<T> reverseList(List<T> list) { return new Reverse<>(list); } @Override public T get(int i) { return list.get(size() - 1 - i); } @Override public int size() { return list.size(); } @Override public boolean add(T e) { list.add(0, e); return true; } @Override public T set(int index, T element) { return list.set(size() - 1 - index, element); } @Override public void add(int index, T element) { list.add(size() - 1 - index, element); } @Override public T remove(int index) { return list.remove(size() - 1 - index); } //他のutilメソッドをオーバーライドします } class Main { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = Reverse.reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
5.素朴な解決策
最後に、この投稿は、リストを逆にする素朴な方法を議論せずに不完全です。基本的な考え方は、空を作成することです ArrayList
リストを逆の順序で繰り返すことにより、元のリストの要素を追加します。
⮚Java8– descendingIterator()
アイデアは、与えられたリストの要素をに蓄積することです LinkedList
ストリームを使用します。次に、の要素に対してイテレータを取得します LinkedList
を使用して逆の順序で LinkedList.descendingIterator()
メソッドを使用して各要素を処理します forEachRemaining()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; class Main { public static<T> List<T> reverseList(List<T> list) { List<T> reverse = new ArrayList<>(list.size()); new LinkedList<>(list) .descendingIterator() .forEachRemaining(reverse::add); return reverse; } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
⮚ List.listIterator()
ここでは、アイデアは使用することです ListIterator
リストを逆の順序で繰り返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.ListIterator; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { List<T> reverse = new ArrayList<>(list.size()); ListIterator<T> itr = list.listIterator(list.size()); while (itr.hasPrevious()) { reverse.add(itr.previous()); } return reverse; } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
⮚Forループ
以下に示すように、単純なforループを使用してリストを逆の順序で繰り返すこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.util.ArrayList; import java.util.Arrays; import java.util.List; //Javaで`ArrayList`を逆にするプログラム class Main { public static<T> List<T> reverseList(List<T> list) { List<T> reverse = new ArrayList<>(list.size()); for (int i = list.size() - 1; i >= 0; i--) { reverse.add(list.get(i)); } return reverse; } public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> reverse = reverseList(list); System.out.println(reverse); } } |
出力:
[5, 4, 3, 2, 1]
これで、JavaでArrayListを逆にすることができます。