2010-11-29 2 views
0

좋아,이 자바 클래스에 내 프로그램이 완료하려고하고 있는데, 나는이 한 부분과 문제가 있습니다. 이것을 제외하고는 다른 모든 것이 작동합니다. 3 배열, 1 문자열, 2 형식 int, 모든 병렬 있습니다. 이 배열을 이름순으로 정렬 한 다음 번호순으로 정렬해야합니다 (먼저 문자열 배열을 사용한 다음 첫 번째 int 배열을 정렬하고 세 번째 배열의 영향을받지 않습니다).자바 정렬 병렬 배열, 도움이 필요 (NullPointerException 오류)

지금까지 가지고있는 코드입니다.

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이 발생합니다.

기본적으로 가짜 클래스 이름과 코스 번호는 해당 색인과 병행하여 등록한 사람의 수를 코스 이름과 번호로 정렬하면서 정렬합니다.

+0

왜 하나의 개체에 모든 데이터를 캡슐화하는 대신 세 개의 개별 배열을 사용하고 있습니까? –

+0

@Anon은 숙제 인 것처럼 들린다 –

+0

a 또는 b가 null입니다. – Codemwnci

답변

0

나는

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

로 구성된 15 라인에서 오류가 발생하고 난 NullPointerException이 무엇입니까.

이는 배열의 요소 중 하나가 null임을 나타냅니다. 배열 내용을 확인하여 정렬하려는 항목에 null 요소가 없는지 확인하십시오. 배열 인덱스가 0에서 시작한다는 사실을 잊지 않도록하십시오. null이 배열의 사전 정렬을위한 합법적 인 값인 경우 코드가 사전 정렬을 유지하는지 확인하십시오. 두 번째 루프합니다 (for (int j=... 일) 후

1

는 다음과 같은 코드가 있습니다

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

코드를 정독에서를, 나의 이해는하지만, 당신이 sDeptArr[i]sDeptArr[iPosMin]의 요소를 교체하려고하는 것입니다 과제가 잘못되었습니다.

숙제인데이 코드가 작동하지 않는 이유를 알아 내려고 노력해야한다고 생각합니다. 디버거에서 코드를 단계별로 실행하거나 코드에서 단계적으로 단계를 밟을 수 있습니다.

+0

+1 실제 문제를 발견했습니다. 힌트 :이 문제로 인해 다른 문제가 발생합니다. 먼저 수정하고 다시 시도하십시오. –

1

a == null 인 경우에만 발생할 수 있습니다. 그러나 a는 sDeptArr [j]입니다. 배열의 요소가 null이라는 뜻입니다.

따라서이 메서드로 보내는 데이터가 일치하지 않습니다.

하지만 왜이 방식으로 분류를 구현합니까? 이 문제를 해결하는 "올바른"방법은 필요한만큼 필드를 포함하는 새로운 데이터 구조를 만드는 것입니다. 그런 다음 하나의 배열을 만들고 Arrays.sort()을 사용하여 정렬하십시오. 언급 한 데이터 구조는 Comparable을 구현해야합니다.

정렬 작업을 수행하는 경우에도 데이터 구조, 배열 하나를 작성하고 정렬 알고리즘을 작성하십시오.

그리고 또 다른 메모.메서드가 배열을 받아들이고 길이가 별도의 매개 변수로 받아 들여지기 때문에 C 배경이있는 것 같습니다. Java 배열은 길이를 "알"있습니다. a.length를 사용하여 배열 a의 길이를 검색하십시오.

+0

배열의 크기가 해당 배열의 레코드 수를 반드시 반영하지 않을 것이라고 추측 할 수 있습니다. 그러므로 카운터 변수입니다. –

0

배열 수준에서 머물러야한다는 가정하에 (실제 세계에서 상위 수준의 데이터 구조를 만들지 않아야 함) 가정하고 거품 정렬을 사용합니다 (기본적으로 사용하는 것처럼 보이지만 실제 세상에서는 종종 너무 느려서는 안됩니다 ...)

너무 많은 임시 위치/변수로 묶여 있습니다. 전체 길이의 최대 값에 대해 루프 외부를 수행하고 검사되지 않은 각 인덱스 (bubble sort 참조)에 대해 내부 루프를 수행 한 다음 기준에 따라 "i"를 "i + 1"과 비교하십시오. 대부분이 경우) 그리고 거꾸로 돌아 가면 "swap"합니다.