0

したがって、宿題として、通常の配列で動作するコードから配列リストをマージソートするプログラムを作成する必要があります。コードが大量の NULL POINTER 例外をスローするため、誰かがどこで間違ったのかを理解するのを手伝ってくれるかどうか疑問に思っていました。私はそれらを修正しようとしましたが、1つを修正すると別のものに移動します....など.

ありがとう!私のコード:

private static ArrayList<Integer> numbers= new ArrayList<Integer>();
private static ArrayList<Integer> helper;
private static int number;
public static void sort(ArrayList<Integer> myNumbers){
    for(int i=0; i<myNumbers.size();i++){
        numbers.add(myNumbers.get(i));
    }
    //numbers=myNumbers;
    number = myNumbers.size()-1;

    mergesort(0, number -1);
}
private static void mergesort(int low, int high){
    //check if low is smaller than high, if not then the array is sorted
    if(low<high){
        //get the index of the element which is in the middle
        int middle=low+(high-low)/2;
        //sort the left side of the array
        mergesort(low, middle);
        //sort the right side of the array
        mergesort(middle +1, high);
        //combine them both
        merge(low, middle, high);
    }
}
private static void merge(int low, int middle, int high){
    //copy both parts into the helper array
    for(int i=high;i>low;i++){
        helper.add((numbers.get(i)));
    }

    int i=low;
    int j=middle+1;
    int k=low;
    //copy the smallest myNumbers from either the left or right side back to the original array
    while(i<middle  && j<high){
        if(helper.get(i)< helper.get(j)){
            numbers.set(k,(helper.get(i)));
            i++;
        }
        else{
            numbers.set(k,(helper.get(j)));
            j++;
        }
        k++;
    }
    //copy the rest of the left side of the array into target array
    while(i<middle){
        numbers.set(k,helper.get(i));
        k++;
        i++;
    }
}

戻り値:

Exception in thread "main" java.lang.NullPointerException
at BinarySearch.merge(BinarySearch.java:61)
at BinarySearch.mergesort(BinarySearch.java:55)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.mergesort(BinarySearch.java:51)
at BinarySearch.sort(BinarySearch.java:43)
at BinarySearch.main(BinarySearch.java:25)
4

5 に答える 5

1

作成されていないマージ関数のヘルパー フィールドにアクセスしようとします。

また、すべての関数/フィールドから static キーワードを削除する必要があると思います。

プライベートな静的 ArrayList ヘルパー。

private static ArrayList helper= new ArrayList();

于 2013-04-25T12:05:45.683 に答える
1

これが犯人です:

for(int i=high;i>low;i++){
    helper.add((numbers.get(i)));
}

代わりに使用for(int i=high; i>=low; i--) {します。

于 2013-04-25T12:09:50.017 に答える
0

与えられた答えが良いものであるというアカデミックな使用のためにアルゴリズムを使用してマージソートを達成しようとしている場合、または Guava が既に持っている実装に興味がある場合は、ここにあります: guava Iterators

于 2013-04-25T12:22:33.350 に答える
0

パブリック クラス マージ済み

public  static void sort(List<String>result )
{

     for( i=0;i<result.size();i++)
     {
        try{

          try{


         if(result.get(i).compareTo(result.get(i+1))>0)
             {
             String aux=result.get(i);
             result.set(i, result.get(i+1));
             result.set(i+1, aux);

             }


             }catch(NullPointerException e){}
          }catch(ClassCastException z){}

        }
    }


public static void main(String[]args) throws ClassNotFoundException
{ 
    String[]resultentry=new String[100];
    int index;//nr de elemente din vectorul de stringuri//
    int i;

    try{
   //declare files and lists//
    BufferedReader firstfile;
    BufferedReader secondfile;


    firstfile=new BufferedReader(new FileReader("lista1.txt"));
    secondfile=new BufferedReader(new FileReader("lista2.txt"));;


         firstentry=firstfile.readLine();
        secondentry=secondfile.readLine();

        while(firstentry!=null&&secondentry!=null)
        {
        firstlist.add(firstentry);
        firstentry=firstfile.readLine();

        secondlist.add(secondentry) ;
        secondentry=secondfile.readLine();

         }


     }catch(IOException exp){}


     try{

    java.util.Collections.sort(firstlist);
    System.out.println("First list sorted :"+ firstlist);

    java.util.Collections.sort(secondlist);
    System.out.println("Second list sorted"+secondlist);


    firstlist.addAll(secondlist);
    java.util.Collections.sort(firstlist);

    System.out.println("Result  list sorted "+" "+firstlist);

    }catch(ClassCastException b){}

   }

}`
于 2015-07-17T21:25:23.050 に答える
0

blackuprise はあなたの 2 つの問題を指摘しました。

マージの実装には別の問題があり、マージ結果が間違っている可能性があります。マージ メソッドの最後には、次のものがあります。

//copy the rest of the left side of the array into target array
while...

配列の右側がすべてマージされ、左側の部分だけに要素が残っていることを毎回どのように確認できますか? (奇妙な文 ^_^ 左の部分には sth. left があります。)

右側も要チェックです。または、 a を使用しSENTINELて「残り」のチェックを回避します。

于 2013-04-25T12:19:10.757 に答える