簡體   English   中英

改組LinkedList時發生ArrayIndexOutOfBoundsException

[英]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某個項目的位置。 例如,如果您的LinkedList10項目,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM