【问题标题】:Bubble sorting arraylis is not working冒泡排序数组列表不起作用
【发布时间】:2015-01-02 14:02:20
【问题描述】:

我正在尝试对汽车制造商和年份进行冒泡排序,我将对汽车年份进行排序,如果两个汽车制造商在同一年,那么它们将按字母顺序排序。我的程序一直运行到我调用 BubbleSorted() 为止。它给了我一个错误 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 我不知道为什么。我的程序似乎是正确的。下面是我的程序。我有 3 个类(main、bubblesortCars、GetCarInfo)。

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.FileReader;


public class TheMain {

    public static void main(String[] args) {

        Scanner keyboard=new Scanner(System.in);
        int choice;
        boolean done = false;

        try{
            String filename1 = "Demo.txt";
            FileReader inputFile = new FileReader(filename1);

            //Instantiate the BufferedReader Class
            BufferedReader bufferReader = new BufferedReader(inputFile);
            ArrayList<GetCarInfo> CarList = new ArrayList();

            //Variable to hold the one line data
            String line;
            StringTokenizer st;
            int i=0;

            // Read file line by line and print on the console
            while ((line = bufferReader.readLine()) != null)   {
                st = new StringTokenizer(line, "\t");
                st.nextToken();
                st.nextToken();
                String getMake = st.nextToken();
                st.nextToken();
                int getYear = Integer.parseInt(st.nextToken());
                GetCarInfo temp;
                temp = new GetCarInfo(getMake, getYear);
                CarList.add(temp);
            }
            bufferReader.close();



                      BubbleSortCars Sorted = new BubbleSortCars();
                         Sorted.bubblesorted(CarList, 0, CarList.size());


        }
        catch (Exception e) 
        { 
             e.printStackTrace();
        }

    }

}



import java.util.ArrayList;


public class BubbleSortCars {
    ArrayList <GetCarInfo> temp= new ArrayList();


    public void bubblesorted(ArrayList <GetCarInfo> grabber, int began, int end){

        for(int i =0; i<end-began-1; i++){
            for(int j=began; j<(end-i-1); j++){
                if(grabber.get(j).year > grabber.get(j+1).year){
                    temp.set(j, grabber.get(j));
                    grabber.set(j,grabber.get(j+1));
                    grabber.set(j+1, temp.get(j));
                    System.out.println("Success"); 
                } 
                else if(grabber.get(j).year==grabber.get(j+1).year){
                    if((grabber.get(j).make).compareTo(grabber.get(j+1).make)>0){
                        temp.set(j, grabber.get(j));
                        grabber.set(j, grabber.get(j+1));
                        grabber.set(j+1, temp.get(j));
                        System.out.println("Success");
                    }
                }
            }
        } 
    }
}




public class GetCarInfo {
    int year;
    String make;

    public GetCarInfo(String newmake, int newyear){
        make = newmake;
        year = newyear;
    }
}

【问题讨论】:

标签: java arraylist bubble-sort


【解决方案1】:

你得到 IndeOutOfBoundException 的原因是由于这一行:

temp.set(j, grabber.get(j));

还有你对arrayList的定义。

 ArrayList<GetCarInfo> temp = new ArrayList();

在这里,您将 temp 定义为没有任何元素的 arrayList,并且您试图在未定义的第 0 个位置设置一个元素。请参阅此内容以供参考http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set%28int,%20E%29

当您像上面那样定义 temp 时,它使用大小 0 创建,并且 jdk 会在内部检查您尝试访问的索引是否小于大小,那么只有它允许您访问/设置内容。

因此,避免这种情况的一种方法是,在方法中定义临时数组列表,例如:

ArrayList<GetCarInfo> temp = new ArrayList(grabber);

或者您可以使用抓取器 arrayList 进行排序,而无需任何其他数据结构。

【讨论】:

    【解决方案2】:

    问题在于 ArrayList temp。设置方法请参考Oracle documentation

    这里你不需要 ArrayList。使用一个简单的 GetCarInfo 对象作为临时变量。

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多