Как заполнить массив, если его размер неизвестен? - PullRequest
0 голосов
/ 05 января 2012

Как избежать java.lang.ArrayIndexOutOfBoundsException, если размер indexes априори неизвестен?

Integer[] indexes = new Integer[]{};
int num = 0;
for (ArrayList<Integer[]> arr: list) {
   for (int i=0; i<arr.length; i++) {
       indexes[num] = arr[i];
       num++;
   }
}

Цель - получить одномерный массив Integer[] indexes из двумерного массива ArrayList<Integer[]> list.

UPDATE :

Например:

list[0] = {1,2,3}
list[1] = {4}

Мне нужно получить:

indexes = {1,2,3,4}

Ответы [ 6 ]

3 голосов
/ 05 января 2012

Используйте новый ArrayList (newList.add(arr[i])), а затем позвоните toArray():

Integer[] indexes = newList.toArray(new Integer[newList.size()]);

Менее эффективное решение, которое не использует промежуточный список - вы можете зациклить всю структуру один раз, чтобы просто посчитать элементы. Затем создайте экземпляр массива с предварительно рассчитанным размером.

1 голос
/ 05 января 2012

Предполагая, что list определяется следующим образом:

List<Integer[]> list = new ArrayList<Integer[]>();

вы можете сделать:

List<Integer> indexList = new ArrayList<Integer>();
for (Integer[] arr: list) {
    indexList.addAll(Arrays.asList(arr));
}

и, наконец, преобразовать в массив:

Integer[] indexes = indexList.toArray(new Integer[indexList.size()]{});
1 голос
/ 05 января 2012

На ум приходят несколько подходов:

  1. Запустите ArrayList, который будет расти соответствующим образом, а затем используйте .toArray () после завершения.Это не эффективно для памяти.
  2. Выполните итерацию по arr и рассчитайте максимальный размер, сформируйте массив с таким размером, а затем повторите заполнение.
0 голосов
/ 05 января 2012

добавьте каждую вещь в отдельный ArrayList и создайте ее массив, используя T [] toArray (T [] a) или Object [] toArray () ... первый метод является безопасным, предоставляемый массив может, но не должен иметь необходимой длины, он будет перераспределен, если его длина меньше размера списка

0 голосов
/ 05 января 2012
  1. Не инициализируйте массив как Integer[] indexes = new Integer[]{};

Вы делаете его массивом нулевой длины.Вместо этого вы должны сделать следующее:

int maxNum=0;
for (ArrayList<Integer[]> arr: list) {

    maxNum += arr.length;

}

Integer[] indexes = new Integer[maxNum];
num=0;
for (ArrayList<Integer[]> arr: list) {
   for (int i=0; i<arr.length; i++) {
       indexes[num+i] = arr[i];

   }
   num+=arr.length;
}

Что я там сделал, так это определил максимальный размер массива, а затем инициализировал массив.в ArrayList, смещая мой ввод на значение предыдущего массива.

С учетом вышесказанного, есть более эффективные способы сделать это, но если у вас есть ArrayList из Integer[]s, вот как бы я это сделал.

0 голосов
/ 05 января 2012

Вы не можете.При инициализации массива вы должны указать его размер.Так что, если вы не знаете размер, вы можете либо объявить массив с очень большим размером и надеяться, что все в него поместится (со всеми связанными недостатками, такими как накладные расходы памяти, массив. Длина, которая становится совершенно бесполезной, ...).Или вы можете использовать ArrayList, который использует массив внутри, но достаточно умен, чтобы увеличить его размер, когда это необходимо.

Вы также можете достичь этого, используя массивы, копируя ваш массив в другой больший массив, когданеобходимо, но тогда вы в основном переписываете ArrayList.

. Если вам потребуется позже преобразовать список обратно в массив, вы можете использовать метод toArray

РЕДАКТИРОВАТЬ:

небольшое обновление на основе дополнительной информации в вопросе.Если вам нужно преобразовать ArrayList<Integer[]> в одномерный массив, вы можете использовать следующие шаги

  1. Создать новый ArrayList<Integer>
  2. Цикл по существующему списку (который содержит Integer[]) и используйте метод Collections#addAll, чтобы добавить все элементы массива в новый список
  3. Преобразовать список в массив с помощью метода toArray
...