繁体   English   中英

MergeSort实现IndexOutOfBounds Java

[英]MergeSort Implementation IndexOutOfBounds Java

import java.util.ArrayList;
import java.util.Random;

public class Merge {

    private static ArrayList<Integer> newArrayList;

    public static ArrayList<Integer> generateArray(int n){
        newArrayList = new ArrayList<Integer>(n);
        Random rand = new Random();
        for (int i = 0; i<n; i++){
            newArrayList.add(rand.nextInt(n + 1));
        }

        return newArrayList;
    }

    public static ArrayList<Integer> mergeSort(ArrayList<Integer> x){
        if (x.size()>1){
        ArrayList<Integer> ArrayList1 = new ArrayList<Integer>(x.size()/2);
        ArrayList<Integer> ArrayList2 = new ArrayList<Integer>(x.size()-(x.size()/2));

        for (int i = 0; i<newArrayList.size()/2; i++){
        ArrayList1.set(i, newArrayList.get(i));
        }
        for (int i = (newArrayList.size()/2); i<((newArrayList.size()/2)+(newArrayList.size()-newArrayList.size()/2)); i++){
        ArrayList2.set(i-(newArrayList.size()/2), newArrayList.get(i));
        }

        //ArrayList1 = mergeSort(ArrayList1);
        //ArrayList2 = mergeSort(ArrayList2);



        int j = 0;
        int k = 0;
        int a = 0;
        while(ArrayList1.size() != j && ArrayList2.size() != k){
        if (ArrayList1.get(j) < ArrayList2.get(k)){
            x.set(a, ArrayList1.get(j));
            a++;
            j++;
        } else {
            x.set(a, ArrayList2.get(k));
            a++;
            k++;
        }
        }
        while (ArrayList1.size()!=j){
            x.set(a, ArrayList1.get(j));
            a++;
            j++;
        }
        while (ArrayList2.size()!=k){
            x.set(a, ArrayList2.get(k));
            a++;
            k++;
        }

    }
        return x;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Integer> new1;
        //ArrayList<Integer> new2;
        //ArrayList<Integer> new3;

        new1 = generateArray(10);
        //new2 = generateArray(100);
        //new3 = generateArray(1000);

        System.out.println(new1);
        mergeSort(new1);
        System.out.println(new1);
    }


}

我正在尝试实现mergeSort方法,但始终出现以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.set(ArrayList.java:337)
    at Merge.mergeSort(Merge.java:23)
    at Merge.main(Merge.java:73)

有任何想法吗?

您试图在ArrayList设置一个不存在的位置,称为ArrayList1 您已将初始容量设置为x.size() / 2 ,但其中没有任何内容。

看起来您正在尝试从位置0开始设置每个位置,因此只需add元素即可。 更换

for (int i = 0; i<newArrayList.size()/2; i++){
    ArrayList1.set(i, newArrayList.get(i));
}

for (int i = 0; i<newArrayList.size()/2; i++){
    ArrayList1.add(newArrayList.get(i));
}

之后,您需要对for循环进行类似的更改,以填充ArrayList2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM