2014-11-06 2 views
0

Я пытаюсь сорвать марку автомобиля и год, где я бы сортировал автомобиль год, и если два автомобиля составляют в том же году, то они отсортированы в алфавитном порядке. Моя программа работает до такой степени, что я называю BubbleSorted(). Это дает мне ошибку java.lang.IndexOutOfBoundsException: Index: 0, Size: 0, и я не знаю почему. Моя программа кажется правильной. Ниже моя программа. У меня есть 3 класса (main, bubblesortCars, GetCarInfo).Bubble сортировка arraylis не работает

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; 
    } 
} 
+0

Вы прочитали это http://docs.oracle.com/javase/7/docs/api/java/lang/IndexOutOfBoundsException.html? Просто исследуйте/отлаживайте код, который бросает это исключение и обнаруживает, почему коллекция пуста и почему ваш код считает, что он должен получить доступ к индексу 0. – BetaRide

ответ

0

Причина вы получаете IndeOutOfBoundException из-за этой линии:

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

и ваше определение ArrayList.

ArrayList<GetCarInfo> temp = new ArrayList(); 

Здесь вы определяете темп, как ArrayList без какого-либо элемента, и вы пытаетесь установить элемент на 0-й месте, которое не определено. См. Это для справки http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set%28int,%20E%29

Когда вы определяете temp, как указано выше, он создается с размером 0, а jdk проверяет внутренне, если индекс, который вы пытаетесь получить, меньше, чем размер, тогда только он позволит вам получить доступ/установить контент.

Так один из способов избежать этого, вы определяете временную ArrayList в методе, как:

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

Или вы могли бы использовать граббер ArrayList, чтобы сделать сортировку без какой-либо другой структуры данных.

0

Проблема с ArrayList temp. Пожалуйста, обратитесь к методу Oracle documentation.

Здесь вам не нужен ArrayList. Пользователь простой объект GetCarInfo как временная переменная.

Смежные вопросы