4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java7】Javaのlistを分割して処理を実行する

Posted at

Javaのlistを分割して処理を実行する(Java7)

はじめに

環境によっては、古いコードをあえて書かなければならない場合も多々あると思います。
Listを分割して処理を実行するコードを Java7 で書く機会があったので、初投稿してみました。

実装


public class Sample {
	public static void main(String[] args) {

		List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
		int size = 2;	// 一度に処理を行うリスト数

		for (int i = 0; i < sampleList.size(); i += size) {
			List<String> list = new ArrayList<>(
					sampleList.subList(i, Math.min(i + size, sampleList.size()))
			);
			System.out.println(list);	// ここで処理を実行する
		}
	}
}

実行結果
[aaa, bbb]	// sampleList.subList(0, 2)
[ccc, ddd]	// sampleList.subList(2, 4)
[eee]		// sampleList.subList(4, 5)

説明

subList(int from, int to)from(含む)からto(含まない)までのListを返します。
for文でfromtoを分割する数ずつ増やし、処理対象のListを取得しています。

Math.min(int a, int b)は2つのint値のうち小さいほうを返します。
Listのサイズが分割する数で割り切れない場合は、toについて考慮する必要があり、
最後の繰り返しの場合、tosampleList.size()を入れています。

subListの注意点

subListで取得したListは元の値とデータを共有しています。つまり、listの値を変更するとsampleListの値も変更されます(例1)。
しかし、newしてから変更を行うことで、元のListを変更をせずにsubListのみを変更することが出来ます(例2)。

例1 subListを変更すると、元のlistも変更される。

public class Sample {
	public static void main(String[] args) {

		List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
		int size = 2;	// 一度に処理を行うリスト数

		System.out.println(sampleList);		// 処理前
		for (int i = 0; i < sampleList.size(); i += size) {
			List<String> list = sampleList.subList(i, Math.min(i + size, sampleList.size()));
			list.set(0, "zzz");				// 処理実行
			System.out.println(list);
		}
		System.out.println(sampleList);		// 処理後
	}
}
実行結果
[aaa, bbb, ccc, ddd, eee]	// 処理前
[zzz, bbb]
[zzz, ddd]
[zzz]
[zzz, bbb, zzz, ddd, zzz]	// 処理後

上記の通り、listを更新した結果、sampleListも更新されたことが分かる。


例2 newすることで、subListを変更しても元のlistが更新されない。

public class Sample {
	public static void main(String[] args) {

		List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
		int size = 2;	// 一度に処理を行うリスト数

		System.out.println(sampleList);		// 処理前
		for (int i = 0; i < sampleList.size(); i += size) {
			List<String> list = new ArrayList<>(
					sampleList.subList(i, Math.min(i + size, sampleList.size()))
			);
			list.set(0, "zzz");
			System.out.println(list);
		}
		System.out.println(sampleList);		// 処理後
	}
}
実行結果
[aaa, bbb, ccc, ddd, eee]	// 処理後
[zzz, bbb]
[zzz, ddd]
[zzz]
[aaa, bbb, ccc, ddd, eee]	// 処理後

上記の通り、listを変更してもsampleListは変更されないことが分かる。

参考

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?