2016-07-23 121 views
1

我有一個對象的集合,我需要一個迭代器,它可以按順序(向前和向後)遍歷對象,但也可以在給定該對象的索引時轉到任何對象代表任務的課程編號)。非順序索引集合

但是,每個對象的索引都需要按順序進行特別的預定義,並且不能保證我的對象列表將具有順序索引(例如,我可以使用索引0,1,6,9) 。我目前有一個ArrayList(),我正在用最大的索引實例化,我期望可以作爲初始容量,但是當我嘗試在我的ArrayList上使用add(index,Object)方法時,我不斷收到ArrayIndexOutOfBounds異常

我的代碼看起來是這樣的:

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當我創建應該是一個大小爲4的ArrayList?

一個相關的問題:當我有一個更好的默認Java集合用於這種情況時,我濫用ArrayList(和它的ListIterator)嗎?期望的最終結果是我的對象有一個迭代器對象,它能夠來回遍歷併到達特定位置(現在,如果存在,我將在給定索引處創建新的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