문제 설명
두 가지 빠른 수정 문제 ‑ 병합 정렬 (two quick fix issues ‑ Merge Sort)
내 버전의 병합 정렬 알고리즘을 Java 코드로 만들었습니다. 내 문제는 다음과 같습니다. 코드를 있는 그대로 실행하면 27번째 줄의 메인에 NullPointerExecpetion이 표시됩니다(주석된 줄 참조). 그리고 메서드를 호출하고 정적 상태가 되지 않고 newArray를 인스턴스화하는 방법이 있다는 것을 알고 있지만 어떻게 .. 누군가 이 문제를 해결하는 데 도움을 줄 수 있습니까? 저는 아직 자바에 익숙하지 않아서 좋습니다. :)
Main:
import java.util.Random;
public class MergeSort_main
{
public static void main(String[] args)
{
int[] originalArray = new int[1000];
Random rand = new Random();
for (int i = 0; i < originalArray.length; i++)
{
int randNum = rand.nextInt(1000)+1;
originalArray[i] = randNum;
}
for(int i = 0; i < originalArray.length; i++)
{
System.out.println(i+"." + originalArray[i]);
}
System.out.println("‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑End Random Array‑‑‑‑‑‑‑\n");
MergeSortAlgorithm.mergeSortAlg(originalArray);
int[] sortedArray = MergeSortAlgorithm.getSortedArray();
for(int i = 0; i < sortedArray.length; i++) //NULL POINTER EXCEPTION HERE
{
System.out.println(i+ "." + sortedArray[i]);
}
}
}
Algorithm Class:
public class MergeSortAlgorithm
{
private static int[] newArray;
public static void mergeSortAlg(int[] randomNums)
{
int size = randomNums.length;
if (size < 2)
{
return; //if the array can not be split up further, stop attempting to split.
}
int half = size / 2;
int firstHalfNums = half;
int secondHalfNums = size ‑ half;
int[] firstArray = new int[firstHalfNums];
int[] secondArray = new int[secondHalfNums];
for (int i = 0; i < half; i++)
{
firstArray[i] = randomNums[i];
}
for (int i = half; i < size; i++)
{
secondArray[i ‑ half] = randomNums[i];
}
mergeSortAlg(firstArray);
mergeSortAlg(secondArray);
merge(firstArray, secondArray, randomNums);
}
public static void merge(int[] firstArray, int[] secondArray, int[] newArray)
{
int firstHalfNums = firstArray.length;
int secondHalfNums = secondArray.length;
int i = 0; //iterator for firstArray
int j = 0; //iterator for second array
int k = 0; //interator for randomNums array
while (i < firstHalfNums && j < secondHalfNums)
{
if (firstArray[i] <= secondArray[j])
{
newArray[k] = firstArray[i];
i++;
k++;
}
else
{
newArray[k] = secondArray[j];
k++;
j++;
}
}
while (i < firstHalfNums)
{
newArray[k] = firstArray[i];
k++;
i++;
}
while (j < firstHalfNums)
{
newArray[k] = secondArray[j];
k++;
j++;
}
}
public static int[] getSortedArray()
{
return newArray;
}
}
참조 솔루션
방법 1:
Basically, the only problem with your code is that you don't initialize newArray
with any values, resulting in a null
.
You are also redefining newArray
at the top of your merge
function .
방법 2:
The problem is that newArray[] is never instantiated i.e. newArray reference is pointing to null. And, no change is made in the newArray so value or reference returned to main is null. And, then you are performing sortedArray.length
where sorted array having a null value.
You have to make newArray[] point to randomNums[].
(by user3712626、ahitt6345、Ashish Ani)