知っていると便利な章

4.11. コレクションと配列のやりとり

『目的』

コレクションと配列間のやりとりを簡潔に行いましょう。

『Before』

配列をCollectionに変換します。
リストを生成して、配列の要素をリストに繰り返し詰めます。

String[] strings = new String[100];

/* 配列 -> Collection */
List<String> list = new ArrayList<>();

for (int i = 0; i < strings.length; i++) {
    list.add(strings[i]);
}

もっと簡単な方法があります。

Collectionを配列に変換します。
配列を生成して、リストの要素を配列に繰り返し詰めます。

Collection<String> values = new ArrayList<>();
values.add("1");
values.add("2");
int n = values.size();

/* Collection -> 配列 */
String[] strings = new String[n];

for (int i = 0; i < strings.length; i++) {
    strings[i] = values.get(i);
}

これも、もっと簡単な方法があります。

『After』

配列をCollectionに変換します。

String[] strings = new String[100];

/* 配列 -> Collection */
List<String> list = Arrays.asList(strings);

forループは必要ありません。また、リストへの変更はそのまま配列に反映されます。

Collectionを配列に変換します。

Collection<String> values = new ArrayList<>();
values.add("1");
values.add("2");

/* Collection -> 配列 */
String[] strings = (String[]) values.toArray(new String[values.size()]);

forループは必要ありません。

上記の例は配列の要素がString、つまりオブジェクト型の場合でした。
配列の要素がint,longといったプリミティブ型の場合は残念ながら、Arrays.asListとCollection.toArrayでは対応できません。 配列の要素がプリミティブ型の場合は以下のようなメソッドを用意することによってArrays.asListとCollection.toArrayに相当する機能を実現することができます。
※ただし、各プリミティブ型用のメソッドを用意する必要があります。

// int配列をList<Integer>に変換する。
List<Integer> asList(final int ... a) {
    return new AbstractList<Integer>() {
        @Override
        public Integer get(int index) {
            return a[index];
        }

        @Override
        public Integer set(int index, Integer element) {
            int before = a[index];
            a[index] = element;
            return before;
        }

        @Override
        public int size() {
            return a.length;
        }
    };
}

// List<Integer>をint配列に変換する。
int[] toIntArray(List<Integer> list) {
    int[] arr = new int[list.size()];

    int i = 0;
    for (int n : list) {
        arr[i++] = n;
    }

    return arr;
}

『まとめ』

Arrays.asListとCollection.toArrayの組み合わせが 配列ベースのAPIとコレクションベースのAPIの橋渡しをします。 ArraysやCollectionには便利なメソッドが色々用意されているので積極的に使いましょう。

< 前のページへ

Pagetop