List と 配列の相互変換

変換前 | 変換後
------ | ------
List&lt;T> | T[]
List&lt;Integer> | int[]
T[] | List&lt;T>
int[] | List&lt;Integer>

基本型のラッパクラスの List は 基本型の配列に変換する。
もっと楽な方法ないのかな。

```java:ConvertListArray.java
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ConvertListArray {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4));
        int[] arr = new int[]{0,1,2,3,4};
        ArrayList<Character> list2 = new ArrayList<Character>(Arrays.asList('h','e','l','l','o'));
        Character[] arr2 = {'h','e','l','l','o'};

        // List<Integer> -> int[]
        if (Arrays.equals(toArr(list),arr)) System.out.println("OK");
        else System.out.println("not OK");
     
        // List<T> -> T[]
        if (Arrays.equals(list2.toArray(new Character[0]),arr2)) System.out.println("OK");
        else System.out.println("not OK");
     
        // int[] -> List<Integer>
        if (toList(arr).equals(list)) System.out.println("OK");
        else System.out.println("not OK");
     
        // T[] -> List<T>
        if (new ArrayList<Character>(Arrays.asList(arr2)).equals(list2)) System.out.println("OK");
        else System.out.println("not OK");
    }   

    public static int[] toArr(List<Integer> list){
        // List<Integer> -> int[]
        int l = list.size();
        int[] arr = new int[l];
        Iterator<Integer> iter = list.iterator();
        for (int i=0;i<l;i++) arr[i] = iter.next();
        return arr;
    }   

    public static ArrayList<Integer> toList(int[] arr){
        // int[] -> ArrayList<Integer>
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int t : arr) list.add(t);
        return list;
    }
}
```

#### 追記
Listと配列の相互変換は簡潔に書けるようになった。
わざわざメソッドにしなくてもいいな。
ただ、ジェネリクスを使った List から 配列への変換はまだ分からない。

```java
// List<T> list -> T[]
list.toArray(new T[0]) // これはエラー。汎用配列は生成できない
list.toArray(new Integer[0]) // Integer 型の場合。

// T[] arr -> List<T>
// 指定された配列に連動する固定サイズのリスト。返されたリストへの変更は、そのまま配列に書き込まれる
Arrays.asList(arr) 
// ArrayList<T> にする場合
new ArrayList<T>(Arrays.asList(arr))
```

```java
import java.util.ArrayList;
import java.util.Arrays;

public class ConvertListArray {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4));
        Integer[] arr = {0,1,2,3,4};

        // List<T> -> T[]
        if (Arrays.equals(list.toArray(new Integer[0]),arr)) System.out.println("OK");
        else System.out.println("not OK");

        // T[]  -> List<T>
        if ( new ArrayList<Integer>(Arrays.asList(arr)).equals(list)) System.out.println("OK");
        else System.out.println("not OK");
    }   
}
```

#### 追記(2)
List&lt;T> list -> T[]
汎用配列の初期化は難しいので、引数に配列を渡してそこにコピーする。

```java
import java.util.ArrayList;

public class ConvertListArray {
    public static void main(String[] args){
        // 使用例
        ArrayList<Character> list = new ArrayList<Character>(Arrays.asList('h','e','l','l','o'));
        Character[] arr = new Character[list.size()];
        toArr(list,arr);
    }

    public static <T> void toArr(List<T> list,T[] arr){
        // List<T> -> T[]
        // arr に list をコピー
        list.toArray(arr);
    }
}
```