好的,所以我有一个任务,它是这样的:
假设您输入包含N的单链表 items(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)
答案 0 :(得分:4)
如果您收到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项)的项目。所以你的数组索引超出界限。