[英]ArrayIndexOutOfBoundsException: -32443 with iterator .next on LinkedList
[英]ArrayIndexOutOfBoundsException when shuffling a LinkedList
好的,我有一個作業,它像這樣:
假設您有一個包含N個項目的單鏈接列表(Java中LinkedList類的實例)作為輸入。 您應該隨機地均勻地重新排列LinkedList中的項目。 您的算法應消耗對數(或常數)的額外內存,並在最壞的情況下按與NlogN成比例的時間運行。
對於算法,我打算使用mergesort,它在合並時會以隨機方式進行。 但是我被程序卡住了,因為它拋出ArrayIndexOutOfBoundsException
但是它不在我的代碼中,而在LinkedList.java中
我對LinkedList不太熟悉,所以我不知道該怎么做,我甚至不確定自己是否以正確的方式進行操作。
編碼:
import java.util.LinkedList;
public class Q02 {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(0);
System.out.println("Shuffled list: "+shuffle(list));
}
public static LinkedList shuffle(LinkedList list){
int node = 10; //just a random node
if(list.size()<=1){
return list;
}
LinkedList<Integer>list1 = new LinkedList<>();
LinkedList<Integer>list2 = new LinkedList<>();
while(!list.isEmpty()){
list1.add((Integer) list.removeFirst());
if(!list.isEmpty()){
list2.add((Integer) list.removeFirst());
}
}
shuffle(list1);
shuffle(list2);
if(list2.size() < list1.size()){
int i = (int)(Math.random() * list2.size());
list2.set(i, node);
}
while(!list1.isEmpty()&&!list2.isEmpty()){
int rand = (int)(Math.round(Math.random()));
if(rand == 1){
list.add(list1.removeFirst());
}
else if(rand == 0){
list.add(list2.removeFirst());
}
}
//If any of list1 or list2 are still empty add everything to list
if(!list1.isEmpty()){
list.add(list2.clone());
}
if(!list2.isEmpty()){
list.add(list1.clone());
}
list.remove(node);
return list;
}
}
這是錯誤:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10, Size: 2
at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
at java.util.LinkedList.remove(LinkedList.java:523)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:62)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.main(Q02.java:22)
如果獲取ArrayIndexOutOfBoundsException
,則意味着您嘗試使用無效索引訪問LinkedList
某個項目的位置。 例如,如果您的LinkedList
有10
項目,則listOfSize10.set(10, node)
將引發ArrayIndexOutOfBoundsException
。
您最可能看到的錯誤是由以下幾行引起的:
int i = (int)(Math.random() * list2.size());
list2.set(i, node);
您可以保證i
始終大於或等於0
且小於list2.size()
嗎?
更新在看到您的堆棧跟蹤之后,看起來錯誤來自以下行:
int node = 10; //just a random node
list.remove(node);
當列表中只有10
項目時,您顯然在這里嘗試刪除索引為10
的項目(或第11個項目)。 因此,您的數組索引超出范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.