【Java】Collectionsによる動的配列の操作
本稿は、JavaでArrayListやLinkedList等、Listインターフェースを実装したクラス等、コレクションAPIに対してソートなどの操作を行う方法を紹介します。
List要素のソート
sortメソッドを利用して要素の順序を並び替えできます。
引数にはComparatorを利用することで、任意のオブジェクトであってもソート可能です。
単純な数値のソートであれば、Comparatorの実装は不要です。
数値を昇順に並べ替え
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(5); list.add(2); list.add(3); list.add(510); list.add(1); Collections.sort(list); System.out.println(list); } }
[1, 2, 3, 5, 510]
数値を降順に並べ替える場合はComparator.reverseOrderかCollections.reverseOrderメソッドを利用しましょう。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(5); list.add(2); list.add(3); list.add(510); list.add(1); Collections.sort(list,Collections.reverseOrder()); System.out.println(list); } }
[510, 5, 3, 2, 1]
任意のオブジェクトを昇順並べ替え(HPの昇順)
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test { public static void main(String[] args) { List<Chara> list = new ArrayList<>(); list.add(new Chara("勇者",100)); list.add(new Chara("魔法使い",30)); list.add(new Chara("曲者",999)); Collections.sort(list, new Comparator<Chara>() { @Override public int compare(Chara o1, Chara o2) { return o1.hp - o2.hp; } }); System.out.println(list); } } class Chara{ String name; int hp; Chara(String name, int hp){ this.name = name; this.hp = hp; } public String toString() { return name; } }
[魔法使い, 勇者, 曲者]
任意のオブジェクトを降順で並べ替え(ラムダ式を利用)
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Chara> list = new ArrayList<>(); list.add(new Chara("勇者",100)); list.add(new Chara("魔法使い",30)); list.add(new Chara("曲者",999)); Collections.sort(list, (o1,o2) -> o2.hp - o1.hp); System.out.println(list); } } class Chara{ String name; int hp; Chara(String name, int hp){ this.name = name; this.hp = hp; } public String toString() { return name; } }
[曲者, 勇者, 魔法使い]
List要素のシャッフル
shuffleメソッドを利用すると要素の順序を反転できます。
カードゲーム制作などでカードをランダムにシャッフルした場合等に使えます。
ゲーム制作では結構使えそうな場面がありそうです。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Collections.shuffle(list); System.out.println(list); } }
[4, 5, 3, 1, 2]
List要素の順序の反転
reverseメソッドを利用すると要素の順序を反転できます。
そんなに使用しないかもしれませんが、どこかで使えるかもしれません。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Collections.reverse(list); System.out.println(list); } }
[5, 4, 3, 2, 1]
同期List、同期Mapの作成
スレッドセーフなリストとしては、VectorやHashtableクラスなどもありますが、Collections.synchronized~メソッドを利用するほうが推奨されます。
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class Test { public static void main(String[] args) { List<Integer> list = Collections.synchronizedList(new ArrayList<>()); list.add(1); list.add(2); list.add(3); System.out.println(list); Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>()); map.put("A", 1); map.put("B", 2); map.put("C", 3); System.out.println(map); } }
[1, 2, 3]
{A=1, B=2, C=3}
ディスカッション
コメント一覧
まだ、コメントがありません