0

好的,我正在尝试为我的 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

4 回答 4

1

在您的第二个循环(第for (int j=...一个)之后,您有以下代码:

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

通过仔细阅读代码,我的理解是您正在尝试交换元素sDeptArr[i]sDeptArr[iPosMin]但是,您的分配不正确。

鉴于这是家庭作业,我认为您应该尝试找出此代码不起作用的原因,并为您提供它起作用的结果。您可以在调试器中单步执行代码,或者(鉴于它相当简单)在您的脑海中单步执行代码。

于 2010-11-29T21:50:26.090 回答
1

仅当 a==null 时才可能发生这种情况。但是 a 是 sDeptArr[j]。这意味着数组的这个元素为空。

因此,您发送到此方法的数据是不一致的。

但是你为什么要以这种方式实现排序呢?解决此问题的“正确”方法是创建包含所需字段的新数据结构。然后创建一个数组并使用Arrays.sort(). 我提到的数据结构应该实现Comparable

即使这是一个排序练习,也要创建数据结构、一个数组并编写排序算法。

还有一个注意事项。似乎您有 C 背景,因为您的方法接受数组和长度作为单独的参数。Java 数组“知道”它们的长度。使用 a.length 检索数组 a 的长度。

于 2010-11-29T21:51:40.570 回答
0

我在第 15 行遇到错误,包括

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

我得到一个 NullPointerException。

这表明您的数组中的元素之一是null. 检查数组的内容以确保您尝试排序的内容不包含null元素。确保您没有忘记数组索引从 0 开始。如果null您的数组具有预排序的合法值,那么请确保您的代码防范它。

于 2010-11-29T21:44:59.567 回答
0

假设您需要保持在数组级别(而不是创建更高级别的数据结构,在现实世界中您应该这样做)并使用冒泡排序(您似乎基本上正在使用,但在现实世界中您通常不应该这样做,太慢了)...

你让自己被太多的临时职位/变量束缚住了。您真正需要为整个长度的最大值执行循环外部,为每个未检查的索引执行内部循环(请参阅冒泡排序),然后根据您的标准将“i”与“i+1”进行比较(考虑两个值在这种情况下最多)并在它们向后时“交换”它们。

于 2010-11-29T22:21:52.480 回答