преобразование двойного массива в 2-мерные массивы в Java - PullRequest
2 голосов
/ 21 февраля 2011

предположим, у меня есть массив данных в форме ArrayList<ArrayList<E>> ... что было бы наиболее элегантным способом преобразовать это в 2-мерные массивы

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Предполагается, что у вас нет нулей или чего-то подобного.Это также не дает никаких гарантий относительно однородности массива (т. Е. Является «прямоугольным»)

final int listSize = list.size();
E[][] darr = new E[listSize][];
for(int i = 0; i < listSize; i++) {
    ArrayList<E> sublist = list.get(i);
    final int sublistSize = sublist.size();
    darr[i] = new E[sublistSize];
    for(int j = 0; j < sublistSize; j++) {
        darr[i][j] = sublist.get(j);
    }
}
0 голосов
/ 21 февраля 2011

Если E является универсальным классом, у нас есть проблема в том, что нельзя создать универсальные массивы без отражения, а в Reflection нам нужен объект класса (или пример объекта массива).

Я не уверен, что это "элегантно", но давайте попробуем:

import java.lang.reflect.Array;

<E> public static E[][] toArray(List<List<E>> list, Class<E> elementType) {
    E[] sample = (E[])Array.newInstance(elementType, 0);
    List<E[]> tempList = new ArrayList<E[]>(list.size());
    for(List<E> subList : list) {
       tempList.add( subList.toArray(sample));
    }
    E[][] finalSample = (E[][])Array.newInstance(sample.getClass(), 0)
    return tempList.toArray(finalSample);
}

Может потребоваться @SuppressWarning("unchecked") для приведений из Array.newInstance.

...