2

編集:コンパレータは何もしていないようです。エラーは発生しませんが、(すでにアルファベット順にソートされている)配列は変更されていません。SADとPADが隣り合っていることを期待する必要がありますが、そうではありません。

文字列の配列があり、ダイヤルパッドでの入力方法から得られた数値に基づいて文字列を並べ替えたいと思います。つまり、 "SAD" = 723、 "PAD" = 723、 "SAP" = 727です。アルファベット順に並べられた辞書があり、配列でバイナリ検索を実行するために、それを自分の順序に並べ替えたいと思います。SADとPADが同じ値である場合は、アルファベット順に並べ替えることができます。Arrays.sort(dictionary、myComparator)を使用して並べ替えてみたいと思います。

まず、これは私が欲しいものを手に入れるための最良の方法でしょうか?他にどうすればこれを手に入れることができますか?

次に、独自のコンパレータを作成するにはどうすればよいですか?私はプログラミングの最初のコースにいるだけなので、まだクラスを作成していません。それはすべて、メインクラスに詰め込まれたものの集まりにすぎません。そして、私は一般的にクラスについてまったく知りません。したがって、これを機能させるために自分のクラスを作成する必要がある場合は、代わりにクイックソートを自分でコーディングする必要があります。リンクリストについても取り上げていないので、データ構造が少し不器用です。これが私がこれまでに持っているものであり、私が何をしているのか分かりません:

辞書をメモリに入れるための愚かな不器用な方法、重要な行は下の方にあります:

public static String[][] dictToMem()throws FileNotFoundException{
    File myFile = new File("src/words.txt");
    Scanner input = new Scanner(myFile);
    String temp;
    String[] tempDict = new String[7];
    Arrays.fill(tempDict, "");

    while (input.hasNext()){
        temp = input.next();
        if (temp.length() < 8 && temp.indexOf('\'') + temp.indexOf('(') +   temp.indexOf('-') == -3){
            for (int i = 1; i <= 7; i++){
                if (temp.length() == i){
                    tempDict[i-1] += " " + temp;
                }
            }
        }
    }
    for (int i = 0; i<tempDict.length; i++){
        tempDict[i] = tempDict[i].trim();
    }

    String[][] dictionary = new String[7][];
    for (int i = 0; i<tempDict.length; i++){
        dictionary[i] = tempDict[i].split(" ");
    }
    for (int i = 0; i<tempDict.length; i++){
        //  ***This is the line doesn't work, compiler error***
        //  dictionary[i] = Arrays.sort(dictionary[i], String.DialPadNumCompare);
        //  Should be this:
        Arrays.sort(dictionary[i], DialPadNumCompare);
    }
    return dictionary;
}

そして、コンパレータはエラーを示していません:

public static Comparator<String> DialPadNumCompare = new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        if (stringToInt(a) == stringToInt(b)){
            return a.compareTo(b);
        }
        return stringToInt(b) - stringToInt(a);
    }
};

String to intは、文字列からダイヤルパッド番号への変換方法です。

4

2 に答える 2

3

コンパレータが正しくありません。次のように変更します。

public static Comparator<String> dialPadNumCompare = new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        int inta = stringToInt(a);
        int intb = stringToInt(b);
        if (inta == intb)
            return a.compareTo(b);
        return inta - intb;
    }
};

そして、このコードを使用してこのコンパレータを呼び出します。

Arrays.sort(dictionary, dialPadNumCompare);

これがライブデモです

于 2012-11-25T06:57:32.450 に答える
0

すぐにエラーが発生した場合は、次の行を変更してください。

Arrays.sort(dictionary[i], String.DialPadNumCompare);

に:

Arrays.sort(dictionary[i], DialPadNumCompare);

String現在のように、クラスの存在しないメンバーを静的に参照しようとしています。DialPadNumCompare代わりに、独自のクラスで作成した静的参照を参照する必要があります。

于 2012-11-25T05:36:56.797 に答える