2016-07-23 2 views
1

У меня есть набор объектов, в которых мне нужен Итератор, который может проходить через объекты по порядку (как вперед, так и назад), но также может перейти к любому объекту при указании этого объекта (который представляет собой номер урока задания).Непоследовательный индексный сборник

Однако, индекс для каждого Объекта должен быть специально предопределен по порядку, и нет гарантии, что мой список объектов будет иметь последовательные индексы (например, я мог бы иметь индексы 0, 1, 6, 9) ,

В настоящее время у меня есть ArrayList(), который я создаю с помощью наибольшегоIndex, который я ожидаю, что возможно в качестве начальной емкости, но я все время получаю исключение ArrayIndexOutOfBounds всякий раз, когда я пытаюсь использовать метод add (index, Object) на моем ArrayList

мой код выглядит следующим образом:

int largestIndex = unindexedAssignments.get(unindexedAssignments.size() - 1).getAssignmentID(); 
    //index of 0 is ignored so add +1 to make sure we have enough space 
    assignments = new ArrayList<>(largestIndex + 1); 

    System.out.println("LargestIndex: " + (largestIndex + 1)); 

    //populate assignments List 
    for(Assignment assignment : unindexedAssignments) { 
     //add the assignment to the list such that the index == the lesson number 
     System.out.println("adding assignment with index of " + assignment.getAssignmentID()); 
     assignments.add(assignment.getAssignmentID(), assignment); 
    } 

и консоль выплевывает что-то вроде этого (окна cmdpromt не поддерживает копирования/вставки> _ <):

largestIndex: 3 
adding assignment with index of 1 
java.lang.IndexOutOfBoundsException: Index 1, Size: 0 
    at java.util.ArrayList.rangeCheckForAdd(Unkown Source) 
    at java.util.ArrayList.add(Unknown Source) 
    (the rest of the stack trace pointing to the section of code I gave above ...) 

Я не понимаю, почему размер == 0, когда я создал то, что должно было быть ArrayList размером 4?

Связанный вопрос: я неправильно использую ArrayList (и это ListIterator), когда для этого обстоятельства лучше использовать сборку Java по умолчанию? Желательным конечным результатом является то, что у моего объекта есть объект Iterator, способный перемещаться назад и вперед и перейти к определенному местоположению (прямо сейчас я бы просто создал новый ListIterator по данному индексу, если он существует)

+0

Вы должны опубликовать свое редактирование в качестве ответа. Ответ на ваш вопрос в порядке. Ура! –

ответ

2

List s не поддерживают разреженные индексы. Если вы хотите добавить к индексу, который находится за концом списка, вам также нужно создать все промежуточные индексы.

Использовать SortedMap. Карты идеально подходят, когда у вас есть несмежные индексы. Вы можете найти любое задание по его номеру урока, и вы можете выполнить итерацию по всем парам ключ-значение по порядку.

SortedMap<Integer, Assignment> assignments = new TreeMap<>(); 

for (Assignment assignment: unindexedAssignments) { 
    assignments.put(assignment.getAssignmentID(), assignment); 
} 

Вы также можете использовать синтаксис Java 8 в качестве альтернативы явному циклу.

Map<Integer, Assignment> assignments = unindexedAssignments.stream() 
    .collect(Collectors.toMap(
     a -> a.getAssignmentID(), // keys 
     a -> a,     // values 
     (a, b) -> throw new IllegalStateException("duplicate lesson number"), 
            // what to do if two items have the same key 
     TreeMap::new    // map class constructor 
    )); 
+0

Удивительный, спасибо! То, в чем я нуждался, - это NavigableMap, а затем значение Integer курсора, чтобы отслеживать, где я был, и он отлично работает. Спасибо за помощь! – CrypticCabub

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