2015-06-10 2 views
1

Мой алгоритм выбора сортировки не работает. Я получаю следующие ошибки: // Исключение в потоке "main" java.lang.NullPointerExceptionПредложения по моему выбору Сортировка/Java

Примечание: это для класса java. У меня нет большого опыта. Я закончил с заданием. Я пытаюсь понять причину, почему мой алгоритм сортировки не работает. Любые предложения по устранению проблемы? Советы? Исправления? ... любая помощь вообще будет оценена по достоинству. Вот мой код:

private void sortFlowers(String flowerPack[]) { 
     // TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts 
     // NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings 


     for(int i = 0; i < flowerPack.length; i++){   
     String currentMinFlow = flowerPack[i]; 
     int minIndex = i; 

      for(int j = i; j < flowerPack.length; j++){ 
       if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){ 
        currentMinFlow = flowerPack[j]; 
        minIndex = j; 
        } 
       } 


       if(minIndex != i){ 
        flowerPack[minIndex] = flowerPack[i]; 
        flowerPack[i] = currentMinFlow; 
       } 
      } 
     } 

Исключение:

Exception in thread "main" java.lang.NullPointerException at 
    java.lang.String$CaseInsensitiveComparator.compare(String.java:1181) at 
    java.lang.String$CaseInsensitiveComparator.compare(String.java:1174) at 
    java.lang.String.compareToIgnoreCase(String.java:1227) at 
    Assignment01Driver.sortFlowers(Assignment01Driver.java:112) at 
    Assignment01Driver.<init>(Assignment01Driver.java:37) at 
    Assignment01Driver.main(Assignment01Driver.java:5) 
+1

Посмотрите на полную трассировку стека при сбое программы. Он укажет вам на строку с неинициализированной ссылкой. –

+0

Исключение в потоке "основного" java.lang.NullPointerException \t в java.lang.String $ CaseInsensitiveComparator.compare (String.java:1181) \t в java.lang.String $ CaseInsensitiveComparator.compare (String.java:1174) \t на java.lang.String.compareToIgnoreCase (String.java:1227) \t на Assignment01Driver.sortFlowers (Assignment01Driver.java:112) \t в Assignment01Driver. (Assignment01Driver.java:37) \t at Assignment01Driver.main (Assignment01Driver.java:5) –

+0

Это то, что я получаю - я не уверен, что это значит. –

ответ

0

Ошибка говорит о том, что вы пытаетесь иметь дело с массивом, который содержит значение null. лучше понять, заполнить все 25 пятен в массиве и запустить программу, это не даст вам никакой ошибки.

Вот решение, которое вам нужно.

private void sortFlowers(String flowerPack[]) 
{ 
    //get the length of the array by counting arrays where the value is not null. 
    int length = 0; 
    for (int i = 0; i < flowerPack.length; i++) 
    { 
     if (flowerPack[i] != null) 
     { 
      length = length + 1; 
     } 
    } 

    //just confirm that the count is correct. 
    System.out.println(length); 

    //set the length to the "length" variable as we have found above. 
    for(int i = 0; i < length; i++) 
    {   
     String currentMinFlow = flowerPack[i]; 
     int minIndex = i; 
     for(int j = i; j < length;j++){ 
      if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0) 
      { 
       currentMinFlow = flowerPack[j]; 
       minIndex = j; 
      } 
     } 
     if(minIndex != i){ 
      flowerPack[minIndex] = flowerPack[i];    
      flowerPack[i] = currentMinFlow; 
     } 
    } 
} 

Просто замените метод sortFlowers на вышеуказанный код и проверьте.

+0

Спасибо! Он работает сейчас! Мой профессор еще не понял это;) –

1

Проблема исходит из того, что ваш массив был создан с фиксированным размером.

String[] flowerPack = new String[25]; 

Когда вы создаете массив переменных ссылочного типа, каждая переменная будет инициализирована со значением null. Если вы вызываете метод sortFlowers перед тем, как каждой переменной присваивается значение, возникает проблема.

for(int i = 0; i < flowerPack.length; i++){   
    String currentMinFlow = flowerPack[i]; 

В вышеуказанном сегменте, вы переборе всех 25 позиций в массиве, в том числе и те ценности, которые до сих пор имеют значение null. Затем, следующая строка вызывает ошибку:

if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){ 

Поскольку вы итерацию через весь массив, вы в конечном итоге со значениями currentMinFlow, которые null. Если вы попытаетесь сделать вызов метода на null эталонным значением, вы в конечном итоге с NullPointerException.

Как правило, вы редко хотите использовать массивы фиксированного размера, когда не уверены в том, сколько элементов данных вы, вероятно, будете иметь. В этом случае вы хотите использовать ArrayList вместо стандартного массива. ArrayList по существу представляет собой динамический массив, который растет и сжимается по мере необходимости, чтобы содержать элементы, которые вы храните в нем. Это избавит вашу проблему от значений null, так как это предотвратит использование каких-либо неиспользуемых элементов в вашем массиве.

Заменить

String[] flowerPack = new String[25]; 

с

ArrayList<String> flowerPack = new ArrayList<>(); 

Если вы хотите добавить или удалить значение из ArrayList вы могли бы сделать

// Add value. 
flowerPack.add(value); 
// Remove value 
flowerPack.remove(value); 

Если вы хотите получить доступ к какой-то элемент в ArrayList:

String element = flowerPack.get(indexOfElement); 

Если вы хотите, чтобы получить размер ArrayList:

int size = flowerPack.size(); 

И если вы не хотите изменить способ сортировки, вы можете держать его так же, заменив линию

sortFlowers(flowerPack); 

с

sortFlowers(flowerPack.toArray(new String[0])); 

для обзора другого ArrayList методы и свойства, проверьте онлайн-документацию: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

+0

Для этого решения я не могу использовать arraylist –

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