2015-11-25 1 views
0

Я создал мою версию алгоритма сортировки слияния в java-коде. Мои проблемы таковы: когда я запускаю код как есть, я получаю NullPointerExecpetion в главной строке 27 (см. Комментарий). И я знаю, что есть способ сделать вызовы метода и создать экземпляр newArray, если они не статичны, но я не совсем уверен, как .. кто-то может исправить это? Я все еще относительно новое для Java так неплохо :)две проблемы с быстрым исправлением - Merge Sort

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]); 
    } 

    }  
} 

Алгоритм Класс:

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

Ну, вы никогда не создаете экземпляр 'newArray' (или присваиваете ему ** любое ** значение), поэтому, когда вы' getSortedArray', он возвращает 'null'. Следовательно, NPE, когда вы пытаетесь оценить 'sortedArray.length'. – azurefrog

ответ

0

В принципе, единственная проблема с вашим кодом является то, что вы не инициализировать newArray с любыми значениями, что приводит к null.

Вы также пересматриваете newArray в верхней части своего merge функции.

+0

@ ahitt66345 Но моя проблема в том, когда я инициализирую его, чтобы сказать newArray = {0}; значение никогда не изменяется в коде, и оно возвращает значение newArrary как 0.0 – user3712626

+0

Вот что, однако, где вы инициализируете 'newArray'? – ahitt6345

+0

, когда вы вызываете 'getSortedArray', вы возвращаете свой частный экземпляр переменной' newArray'. Что не имеет ничего. – ahitt6345

0

Проблема в том, что newArray [] никогда не создается экземпляром, то есть ссылка newArray указывает на null. И в newArray изменений не происходит, поэтому значение или ссылка, возвращаемая в main, равна null. И затем вы выполняете sortedArray.length, где отсортированный массив имеет нулевое значение.

Вы должны сделать newArray [] точкой для случайных чисел [].