2014-02-05 3 views
2

Существует ArrayList<Integer> al, и я хочу скопировать первую половину ее элементов в другую ArrayList<Integer> firstHalf. (Если al имеет нечетное число элементов, firstHalf должен иметь еще один элемент.) Однако следующий код генерирует IndexOutOfBoundsException и говорит Index: 0, Size: 0, хотя я не уверен, как это будет проблемой, поскольку индексы ArrayLists начинаются на 0. Кроме того, я знаю .arraycopy, но я хотел бы сделать это таким образом, с for-loops.Копирование первой половины ArrayList

int x = al.size()/2 + (al.size()%2) - 1; 
for(int i = 0; i < x; i++){ 
    firstHalf.set(i, al.get(i)); 
} 
+2

Рассмотрите возможность использования 'subList'. –

+1

@SotiriosDelimanolis Обратите внимание: 'subList()' возвращает «представление» исходного списка, а не копию. Поэтому вам нужно что-то вроде 'firstHalf = new ArrayList (al.sLList (0, newSize));' – millimoose

ответ

6

Вы должны использовать add вместо set:

int x = al.size()/2 + (al.size()%2) - 1; 
for(int i = 0; i < x; i++){ 
    firstHalf.add(al.get(i)); 
} 

Было бы лучше использовать List#subList

+0

А, спасибо, я забыл об этом. Однако мне было интересно, почему '.set' не работает? – javaChipFrapp

+2

@howAnAngel_Dies_ Чтобы использовать 'set', ваш список не должен быть пустым. Если вы делаете 'firstHalf.set (0, something)' и ваш список пуст, то элемент в индексе '0' не существует, поэтому его нельзя установить – BackSlash

+1

@howAnAngel_Dies_ [" ** Заменяет ** элемент в указанной позиции в этом списке с указанным элементом. "] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set (int,% 20E)) Принесено вам Комитетом для чтения Javadoc To You. – millimoose

7

List#subList является точно подходит для этой цели.

int chunkSize = al.size() % 2 == 0 ? al.size()/2 : (al.size()/2) + 1; 
List<Integer> firstHalf = al.subList(0, chunkSize); 

Есть два случая:

  • Даже: Если размер четно, то п/2 является правильным размером, чтобы кусок по.
  • Нечетный: Если размер нечетный, тогда вам нужно добавить 1 к результату, чтобы список нечетной длины имел среднее значение.
+0

Вы уверены, что последнее предложение? Конвенция при указании индексов «от» и «до» заключается в том, что индекс «to» является ** исключительным **. (Что еще более важно, Javadoc говорит, что это эксклюзивно.) – millimoose

+0

Хороший улов. Не совсем уверен, что я там думал. Добавление 1 к концу этого значения должно исправить это. – Makoto

+0

Теперь вы разбили его на списки с четным количеством элементов. Spoiler: '((al.size() + 1)/2) - 1', если у вас есть *, чтобы быть умным с модульной арифметикой вместо добавления' if'. – millimoose

1

Другой подход:

List<Integer> firstHalf = al.subList(0, al.size()/2 + (al.size()%2) - 1); 
0
List<Integer> firstHalf = al.subList(0, (int) al.size()/2 + 1); 

легче преобразовать al.size()/2 до целого числа, чем делать "% 2".

Вы добавляете 1 к firstHalf, чтобы быть больше, чем вторая половина.

Смежные вопросы