ランダム配列を作成する

ジェネリックを使ってるので汎用的に配列の中身をシャフルできる
※参考URL http://www.knowd.co.jp/yamazaki/?q=node/141

■実行結果

作成データ
MyClass [name=aaa, val=10]
MyClass [name=bbb, val=20]
MyClass [name=ccc, val=30]
MyClass [name=ddd, val=40]
Copyデータ
MyClass [name=ddd, val=40]
MyClass [name=ccc, val=30]
MyClass [name=bbb, val=20]
MyClass [name=aaa, val=10]
シャッフル前 作成データが変更されていないことを確認
MyClass [name=aaa, val=10]
MyClass [name=bbb, val=20]
MyClass [name=ccc, val=30]
MyClass [name=ddd, val=40]
シャッフル後
MyClass [name=aaa, val=10]
MyClass [name=ddd, val=40]
MyClass [name=bbb, val=20]
MyClass [name=ccc, val=30]

■ソース

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Test {

	static class MyClass {
		String name;
		String val;

		public MyClass(String name, String val) {
			this.name = name;
			this.val = val;
		}

		@Override
		public String toString() {
			return "MyClass [name=" + name + ", val=" + val + "]";
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyClass cl1 = new MyClass("aaa", "10");
		MyClass cl2 = new MyClass("bbb", "20");
		MyClass cl3 = new MyClass("ccc", "30");
		MyClass cl4 = new MyClass("ddd", "40");

		List<MyClass> list = new ArrayList<MyClass>();
		list.add(cl1);
		list.add(cl2);
		list.add(cl3);
		list.add(cl4);

		System.out.println("作成データ");
		for (MyClass cl : list) {
			System.out.println(cl);
		}

		//元データのシャッフル配列を作成
		List<MyClass> copylist = createShaffleArray(list);
		System.out.println("Copyデータ");
		for (MyClass cl : copylist) {
			System.out.println(cl);
		}

		System.out.println("シャッフル前 作成データが変更されていないことを確認");
		for (MyClass cl : list) {
			System.out.println(cl);
		}

		//元データをシャッフルして書き換え
		shaffleArray(list);
		System.out.println("シャッフル後");
		for (MyClass cl : list) {
			System.out.println(cl);
		}

	}

	/**
	 * 配列の中身をシャッフルする
	 * 
	 * @param <E>
	 * @param list
	 */
	public static <E> void shaffleArray(List<E> list) {
		List<E> swapList = new ArrayList<E>();
		Random random = new Random();

		// 配列をひとつずつ取り出して、swap配列を作成
		while (list.size() > 0) {
			int val = random.nextInt(list.size());
			swapList.add(list.remove(val));
		}

		// 再作成
		for (E val : swapList) {
			list.add(val);
		}

	}

	/**
	 * 配列の中身をシャッフルした配列を返す
	 * 
	 * @param <E>
	 * @param list
	 */
	public static <E> List<E> createShaffleArray(final List<E> list) {
		List<E> result = new ArrayList<E>();
		List<E> copyArray = new ArrayList<E>();
		Random random = new Random();

		//配列をコピーする
		for(E val:list){
			copyArray.add(val);
		}
		
		// 配列をひとつずつ取り出して、swap配列を作成
		while (copyArray.size() > 0) {
			int val = random.nextInt(copyArray.size());
			result.add(copyArray.remove(val));
		}

		return result;
	}

}