2013-11-26 1 views
1

My Source LinkedList имеет 20300 единиц. Мне нужно разбить этот список на подкатегории для каждых 2500 позиций соответственно, а остальные значения (300 в этом случае) должны присутствовать в финале List.Перерыв LinkedList в несколько списков, основанный на количестве элементов в списке

Пожалуйста, дайте мне знать, как я могу это достичь?

Ниже код работает отлично, за последние 300 значений, за исключением, она бросает ошибка ..

private static List<List<String>> split(LinkedList<String> src, int maxSize){ 
    List<List<String>> splittedList = new ArrayList<List<String>>(); 
    int itemsRemaining = src.size(); 
    int start = 0; 

    while (itemsRemaining != 0) { 
     int end = itemsRemaining >= maxSize ? (start + maxSize) : itemsRemaining; 

     splittedList.add(src.subList(start, end)); 

     int sizeOfFinalList = end - start; 
     itemsRemaining = itemsRemaining - sizeOfFinalList; 
     start = start + sizeOfFinalList; 
    } 

    return splittedList; 

} 
+7

Что вы попробовали? – Shamse

+0

Какая ошибка у вас? Каково значение начала и конца в момент получения ошибки? – Freiheit

+0

Ошибка @Freiheit - Исключение в потоке "main" java.lang.IllegalArgumentException: fromIndex (6)> toIndex (2) \t at java.util.SubList. (Неизвестный источник) \t at java.util.AbstractList.subList (Неизвестный источник) – Mahiz

ответ

0

Вы ошиблись при вычислении конца. Вместо

int end = itemsRemaining >= maxSize ? (start + maxSize) : itemsRemaining; 

Это должно быть

int end = start + (itemsRemaining >= maxSize ? maxSize : itemsRemaining); 

Или скорее

int end = start + Math.min(maxSize ,itemsRemaining); 

Обратите внимание, что в версии для последних элементов конец установлен на количество оставшихся элементов, а не размер исходного списка.

0

Создать функцию, которая рекурсивно вызывает себя первоначальный список, счетчик, и пустой список (аккумулятор). В этой функции выполните следующие действия:

Проверьте, пуст ли исходный список, и если да, то верните аккумулятор. В противном случае проверьте, равен ли счетчик 300 (или что-то еще), и если да, добавьте следующий элемент в исходный список в накопитель, установите «следующий» текущего элемента в исходном списке равным нулю и вызовите функцию с тем же самым следующим элементом, нолем и аккумулятором, возвращая результат. В противном случае вызовите функцию со следующим элементом в списке, счетчиком с добавлением и аккумулятором, возвращая результат.

Вызвать функцию с исходным списком, нулевым и пустым списком. Он должен вернуть результат.

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

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