Java сортировка параллельных массивов, требуется помощь (ошибка NullPointerException) - PullRequest
0 голосов
/ 30 ноября 2010

Ладно, я пытаюсь закончить эту программу, чтобы перейти в класс java, и у меня возникли проблемы с этой частью. Все остальное работает, кроме этого. У меня есть 3 массива, 1 строка, 2 типа int, все параллельные. Я должен отсортировать их в алфавитном порядке по имени, а затем по номеру (сначала используя строковый массив, затем первый массив int, третий массив не влияет на сортировку, он должен практиковать параллель в 3 измерениях)

Это код, который у меня есть.

    public static void sortDatabase(int numRecords, String[] sDeptArr, 
              int[] iCourseNumArr, int[] iEnrollmentArr)
   {
       System.out.println("Sort the database. \n");
       String sTemp = null;
       int iTemp = 0;
       int eTemp = 0;
       for(int i=0; i<numRecords; i++)
       {
           int iPosMin = i;
           for(int j=i+1; j<numRecords; j++)
           {
               String a = sDeptArr[j];
               String b = sDeptArr[iPosMin];
               if(a.compareTo(b) != 0)
                   iPosMin = j;
               else if(!sDeptArr[j].equals(sDeptArr[iPosMin]) && iCourseNumArr[j] < iCourseNumArr[iPosMin])
                   iPosMin = j;
           }
           sDeptArr[i] = sTemp;
           sDeptArr[i] = sDeptArr[iPosMin];
           sDeptArr[iPosMin] = sTemp;
           iCourseNumArr[i] = iTemp;
           iCourseNumArr[i] = iCourseNumArr[iPosMin];
           iCourseNumArr[iPosMin] = iTemp;
           iEnrollmentArr[i] = eTemp;
           iEnrollmentArr[i] = iEnrollmentArr[iPosMin];
           iEnrollmentArr[iPosMin] = eTemp;
       }
   }

Это должно быть сделано в Java. Я получаю сообщение об ошибке в 15-й строке, состоящей из

if(a.compareTo(b) != 0)

и я получаю исключение NullPointerException.

По сути, я сортирую поддельные имена классов и номера курсов, сохраняя количество зачисленных людей параллельно с соответствующим индексом для названия курса и номера.

Ответы [ 4 ]

1 голос
/ 30 ноября 2010

После второго цикла (for (int j=... один) у вас есть следующий код:

       sDeptArr[i] = sTemp;
       sDeptArr[i] = sDeptArr[iPosMin];
       sDeptArr[iPosMin] = sTemp;

Из прочтения кода я понимаю, что вы пытаетесь поменять местами элементы в sDeptArr[i] и sDeptArr[iPosMin], однако ваши назначения неверны.

Учитывая, что это домашнее задание, я думаю, вам следует попытаться понять, почему этот код не работает и дает вам результат, который он делает. Вы можете пройтись по коду в отладчике или (учитывая, что это довольно просто) пройти по коду в вашей голове.

1 голос
/ 30 ноября 2010

Это может произойти, только если == ноль. Но это sDeptArr [j]. Это означает, что этот элемент массива является нулевым.

Итак, данные, которые вы отправляете этому методу, противоречивы.

Но почему вы осуществляете сортировку таким образом? «Правильный» способ решить эту проблему - создать новую структуру данных, которая содержит столько полей, сколько вам нужно. Затем создайте один массив и отсортируйте его, используя Arrays.sort(). Упомянутая мной структура данных должна реализовывать Comparable.

Даже если это упражнение для сортировки, создайте структуру данных, один массив и запишите алгоритм сортировки.

И еще одна заметка. Кажется, что у вас есть фон C, потому что ваш метод принимает массив (ы) и длину в качестве отдельного параметра. Java-массивы "знают" их длину. Используйте a.length для получения длины массива a.

0 голосов
/ 30 ноября 2010

Предполагая, что вам нужно оставаться на уровне массива (а не создавать структуры данных более высокого уровня, которые в реальном мире вам следует) и использовать пузырьковую сортировку (которую вы, кажется, в основном используете, но в реальном мире вы часто не должныне слишком медленно) ...

Вы связываете себя с слишком большим количеством временных позиций / переменных.Все, что вам действительно нужно сделать, это сделать внешний цикл максимум для максимальной длины и внутренний для каждого неисследованного индекса (см. сортировка по пузырям ), а затем сравнить «i» с «i + 1» на основе вашегокритерии (которые в данном случае учитывают не более двух значений) и «меняют» их, если они задом наперед.

0 голосов
/ 30 ноября 2010

Я получаю сообщение об ошибке в 15-й строке, состоящей из

if(a.compareTo(b) != 0)

, и я получаю исключение NullPointerException.

Это указываетчто один из элементов в вашем массиве null.Проверьте содержимое массива, чтобы убедиться, что то, что вы пытаетесь отсортировать, не содержит null элементов.Убедитесь, что вы не забыли, что индексы массива начинаются с 0. Если null является допустимым значением для массива для предварительной сортировки, убедитесь, что ваш код защищает от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...