0

次のプログラムは、マージ ソートを使用して、ファイル内の最初の 10,000 語を並べ替えます。私は Thomas Cormen の Introduction to Algorithms, Second Ed の疑似コードに従いました。

import java.io.*;
import java.util.*;

public class SortingAnalysis {

    public static void merge(String[] A, int p, int q, int r) {
        int n1 = q-p+1;
        int n2 = r-q;
        double infinity = Double.POSITIVE_INFINITY;
        int i, j;
        String[] L = null;
        String[] R = null;
        for (i=1; i<=n1; i++) {
            L[i] = A[(int) (p+i-1)];
        }
        for (j=1; j<=n2; j++) {
            R[j] = A[(int) (q+j)];
        }
        L[n1+1] = infinity; //type mismatch: cant convert from double to string
        R[n2+1] = infinity; //same as above
        i=1;
        j=1;
        for (int k=(int) p; k<=r; k++) {
            int comparison = L[i].compareTo(R[j]);
            if (comparison<=0) {
                A[k] = L[i];
                i++;
            }
            else {
                A[k] = R[j];
                j++;
            }
        }

    }

    public static void mergeSort(String[] A, int p, int r) {
        if (p<r) {
            int q = (int) Math.floor((p+r)/2); //I typecasted q here so I can still pass the variables
            mergeSort(A, p, q);
            mergeSort(A, q+1, r);
            merge(A, p, q, r);
        }
    }

    public static void main(String[] args) {
        final int NO_OF_WORDS = 10000;
        try {
            Scanner file = new Scanner(new File(args[0]));
            String[] words = new String[NO_OF_WORDS];

            int i = 0;
            while(file.hasNext() && i < NO_OF_WORDS) {
                words[i] = file.next();
                i++;
            }
            long start = System.currentTimeMillis();
            mergeSort(words, 0, words.length-1);
            long end = System.currentTimeMillis();
            System.out.println("Sorted Words: ");
            for(int j = 0; j < words.length; j++) {
                System.out.println(words[j]);
            }   
            System.out.print("Running time of insertion sort: " + (end - start) + "ms");

        }
        catch(SecurityException securityException) {
            System.err.println("Error");
            System.exit(1);
        }
        catch(FileNotFoundException fileNotFoundException) {
            System.err.println("Error");
            System.exit(1);
        }
    }
} 

コンソールにエラーが表示される
Exception in thread "main" java.lang.Error: Unresolved compilation problems: Type mismatch: cannot convert from double to String Type mismatch: cannot convert from double to String

at SortingAnalysis.merge ... mergeSort and main </code>


doubleであるはずのMath.floorメソッドが原因だと思いますが、intに型キャストしたので、パラメーターを渡すときに問題はありません。

また、文字列を無限に代入する際にエラーが発生したと思います。しかし、私はコーメンの疑似コードに従っているだけです。自分でコードを「デバッグ」したので、それは正しいようです。ただし、コードに入れると、機能しません。どこで間違ってしまうのでしょうか? 私はあなたの助けが必要です、皆さん。私はJavaが初めてで、まだバッファリングプロセス中です。どうもありがとうございました!

4

2 に答える 2

3

これは、doubleであるはずのMath.floorメソッドが原因だと思いますが、intに型キャストしたので、パラメーターを渡すときに問題はありません。

いいえ、それよりも簡単です。文字列配列にdouble値を割り当てようとしています。あなたは単にそれをすることはできません。

double[]の代わりに使用するようにコード全体を変更する必要があると強く思いますString[]コンパイル中であっても(そして、すべてのコンパイルエラーを実際に修正するまで実行しようとしないでください)、これが原因で問題が発生することに注意してください。

String[] L = null;
String[] R = null;
for (i=1; i<=n1; i++) {
    L[i] = A[(int) (p+i-1)];
}

それは明らかにを投げるつもりNullPointerExceptionです。配列オブジェクトを参照するように配列変数を初期化していない。あなたは次のようなものが欲しいです:

double[] L = new double[n1 + 1];
double[] R = new double[n1 + 1];
for (i=1; i<=n1; i++) {
    L[i] = A[(int) (p+i-1)];
}

配列を1ベースの方法で使用するのは奇妙なことですが、次のようなことを行う方がはるかに慣用的です。

double[] L = new double[n1];
double[] R = new double[n1];
for (i = 0; i < n1; i++) {
    L[i] = A[p + i];
}

ここで2つのことを学ぼうとしているため、苦労しているように感じます。

  • マージソートのしくみ
  • Javaのしくみ

私は最初にJava言語を理解することに集中します。その時点で、擬似コードを実際のコードに変換するためのより良い立場に立つことができます。

于 2012-07-09T09:51:07.820 に答える
0

(int)とにかくキャストするとフロアになります。

  L[n1+1] = infinity; //type mismatch: cant convert from double to string

doubleこれは、aaをAにキャストできないため、エラーです。これをString使用して変換してtoString()も、目標と思われるmaixmum文字列値ではない「NaN」が取得されるため、正しくありません。

ダミーの「無限大」値を追加せずにこれをコーディングできます。代わりにそれを行うことをお勧めします。

于 2012-07-09T09:50:18.707 に答える