【Java】Collectionsによる動的配列の操作

2018年3月11日

本稿は、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}

Java

Posted by nompor