【Java】配列操作用クラスArrays

2020年3月8日

本稿は配列操作用クラスのArraysクラスの一部の機能を紹介します。

特に配列内の要素をソートするメソッドが便利です。

配列のコピー

copyOfメソッドを使用すると配列のコピーが作成できます。
=で代入するものは参照先が同じになるのに対し、このメソッドを実行すると別の参照先に同じ内容の配列を作成します。

Arrys.copyOf(配列)で実行しましょう。

import java.util.Arrays;

public class Test{
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5};

		int[] copyArr = Arrays.copyOf(arr, arr.length);

		//コピー後の配列の中身
		System.out.println(Arrays.toString(copyArr));

		//新しい配列なので参照先は違う
		System.out.println(copyArr == arr);
	}
}
実行結果

[1, 2, 3, 4, 5]
false

ちなみに参照先が同じコピーをすることをシャローコピーといい、別の参照先に同じものをコピーすることをディープコピーなどと呼ばれたりします。

配列の指定範囲をコピー

copyOfRangeメソッドを利用すると配列の指定範囲の新しい配列を作成できます。

Arrays.copyOfRange(コピー元配列, 開始要素番号, 終了要素番号)

import java.util.Arrays;

public class Test{
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5};

		//要素番号2と3の配列を作成する
		int[] copyArr = Arrays.copyOfRange(arr, 2, 4);
		System.out.println(Arrays.toString(copyArr));
	}
}
実行結果

[3, 4]

配列をListオブジェクトに変換

配列をList系オブジェクトに変換できます。

Listオブジェクトを引数にするメソッドを利用したいときなどに活用できます。

Arrays.asList(配列)で変換しましょう。

import java.util.Arrays;
import java.util.List;

public class Test{
	public static void main(String[] args) {
		Integer[] arr = {1,2,3,4,5};

		List<Integer> list = Arrays.asList(arr);
		System.out.println(list);
	}
}
実行結果

[1, 2, 3, 4, 5]

配列をStreamオブジェクトに変換

配列をラムダ式で操作したい場合に利用できます。

Arrays.stream(配列)で変換しましょう。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test{
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5};

		List<String> ist = Arrays.stream(arr)
			.mapToObj(e -> String.valueOf(e+5))
			.collect(Collectors.toList());
		System.out.println(ist);
	}
}
実行結果

[6, 7, 8, 9, 10]

配列のソート

Arrays.sortメソッドを利用すると配列内のデータを昇順ソートできます。

import java.util.Arrays;

public class Test{
	public static void main(String[] args) {
		int[] arr = {6,4,1,2,5};

		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
	}
}

実行結果

[1, 2, 4, 5, 6]


降順に並べ替えたいときはArrays.sort(配列,Comparator)を利用しましょう。

引数Comparatorインターフェースは二つのオブジェクトの大小比較を実装するオブジェクトです。

比較結果は正の数、負の数、0のどれかを返し、0は等価と判断するように実装します。

ただし、数値の降順や文字列の降順を実装したい場合は既に降順実装されたComparatorをComparator.reverseOrder()で取得できます。

import java.util.Arrays;
import java.util.Comparator;

public class Test{
	public static void main(String[] args) {
		Integer[] arr = {6,4,1,2,5};

		Arrays.sort(arr, Comparator.reverseOrder());
		System.out.println(Arrays.toString(arr));
	}
}
実行結果

[6, 5, 4, 2, 1]


オリジナルのオブジェクトをソートする例も紹介しておきましょう。

import java.util.Arrays;
import java.util.Comparator;

public class Test{
	public static void main(String[] args) {
		Chara[] ch = new Chara[3];
		ch[0] = new Chara("勇者",50);
		ch[1] = new Chara("傍観者",99);
		ch[2] = new Chara("魔法使い",20);

		Arrays.sort(ch, new CharaComparator());
		System.out.println(Arrays.toString(ch));
	}
}
//キャラを並び替えるComparator
class CharaComparator implements Comparator<Chara>{
	@Override
	public int compare(Chara o1, Chara o2) {
		return o2.lv - o1.lv;
	}
}
class Chara{
	String name;
	int lv;
	Chara(String name, int lv){
		this.name = name;
		this.lv = lv;
	}
	public String toString() {
		return name;
	}
}
実行結果

[傍観者, 勇者, 魔法使い]

サンプルではそれぞれのキャラのレベルの降順で並び替えるComparatorを実装した例です。

Comparatorを別クラスへインターフェースの実装で作成するのは面倒なので、java7以前の場合は匿名クラス、java8以降はラムダ式で使用されていることが多いです。

通常はラムダ式を使用して比較処理を実装することをオススメします。

上記をラムダ式にするならわざわざComparatorインターフェースを実装せずに
Arrays.sort(ch, (o1,o2) -> o2.lv – o1.lv);
と記述するだけで済みます。

配列の中身を特定の値で初期化

配列の中身全てを特定の値で初期化する場合は

Arrays.fill(配列)

と定義します。

import java.util.Arrays;

public class Test{
	public static void main(String[] args) {
		int[] arr = new int[10];

		Arrays.fill(arr, 3);
		System.out.println(Arrays.toString(arr));
	}
}
実行結果

[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

Java

Posted by nompor