2014-11-16 3 views
0

Я пытаюсь написать метод, который помещает каждую строку в список массива строк в алфавитном порядке по мере ввода строк. Например, если я введу 4 в качестве размера списка желаемых массивов и введите Anne, Bill, Aran, Carol, метод должен напечатать Anne, Aran, Bill, Carol. Однако сейчас он только подсказывает мне 3 строки и ничего не распечатывает. Вместо этого он дает эту ошибку «Исключение в потоке» main «java.lang.IndexOutOfBoundsException: Index: 2, Size: 2." Почему это дает мне эту ошибку?ArrayList в алфавитном порядке (java)

public static ArrayList<String> getOrderedListOfNames() 
{ 
    System.out.println ("How big an array?"); 
    int size = sc.nextInt(); 
    ArrayList<String> names= new ArrayList<String>(size); 

    System.out.println ("Type in a string"); 
    String firstInput= sc.next(); 
    names.add(firstInput); 
    System.out.println ("Type in a string"); 
    String secInput= sc.next(); 
    if (secInput.compareTo(firstInput)>0) 
     names.add(secInput); 
    else 
     names.add(0,secInput); 
    if (size>2) 
    { 
     for (int i = 2 ; i < size ; i++) 
     { 
      System.out.println ("Type in a string"); 
      String input= sc.next(); 
      int entered=0; 
      for (int j=0; j<names.size(); j++) 
      { 
       String name1=names.get(j); 
       String name2=names.get(j+1); 
       if (input.compareTo(name1)>0 && input.compareTo(name2)<0) 
       { 
        names.add(j+1, input); 
        entered=1; 
        j=names.size(); 
       } 

      } 
      if (entered==0) 
       names.add(input); 
     } 
    } 
    return names; 

} 
+0

Если вы получаете ошибки, тогда всегда предоставляйте полный StackTrace и отметьте строку, которая вызывает это исключение. Проблема заключается в этой строке: 'String name2 = names.get (j + 1);'. 'j' может достигать значения' names.size() - 1', поэтому 'j + 1' будет индексом, который не существует в списке. В этом случае индекс '2'. – Tom

ответ

2

для списка размера 2 (например ["a", "b"]) вы обход от 0 до 1 в j но вы j + 1 это означает, что в течение 1 вы будете пытаться получить доступ 2 который, безусловно, из связанного

либо идти ДО < size - 1 или просто использовать Collections.sort(yourArrayList)

0

первый построить свой массив

второй итерации с использованием компаратора:

class LexicographicComparator implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
     return a.compareToIgnoreCase(b); 
    } 
} 



//... your code 
Collections.sort(list, new LexicographicComparator()); 
Смежные вопросы