2

次のコードは、Vector を文字列ベクトル (キーとして使用) と最後に整数 (値として使用) に分割します。

payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));

問題の TreeMap は、 Comparator を次のメソッドで使用して構築されます。このメソッドは、長さも考慮した辞書式の大文字と小文字を区別しない順序付けを課します (長いベクトルは、短いベクトルよりも常に「大きく」なります)。

public int compare(Vector<String> arg0, Vector<String> arg1) {
        int sgn = 0;
        if (arg0.size() > arg1.size()) {
            return 1;
        } else if (arg0.size() < arg1.size()) {
            return -1;
        }
        for (int i = 0; i < arg0.size(); i++) {
            if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == 1) {
                sgn = 1;
                break;
            } else if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == -1) {
                sgn = -1;
                break;
            } else {
                continue;
            }
        }
        return sgn;
    }

さて、問題は...これが読み取られているテキストファイルに8つのエントリがあるにもかかわらず、マップは最大2つのエントリしか取得しません。1 つのエントリ (キー) が入力されるとそのままになりますが、値はスキャン プロセスを繰り返すたびに (ファイル内の行から新しいベクトルを読み取るたびに) 変化します。2 つを除く他のすべてのキーを破棄します。

これは私のコンパレータの問題ですか? それとも、TreeMap が put() で理解できないことをしているのですか?

4

3 に答える 3

4

回答質問に回答しません、コード以外にいくつかのマイナーなポイントがあります。

  1. compareToを2回実行しないでください。一度比較して、結果をsgnに割り当てます。その後、!=0の場合は中断します
  2. あなたの他の継続は冗長です。
  3. -1または1を比較するのではなく、<0または>0を比較する必要があります。多くのcompareToメソッドは(x1-x2)に基づいて戻り、負または正の数を与えることができます。

編集:ドー!そしてもちろん、String.compareToIgnoreCase()の戻り値は、それらの(3)コンパレーターの1つです。私が指摘したのと同時に投稿された他の回答が指摘しているように、それがあなたのエラーの原因である可能性があります。

EDIT2:質問を反映するように冒頭陳述を修正しました。

于 2009-01-06T02:06:02.073 に答える
2

これが問題の原因かどうかはわかりませんが、Java の比較関数は通常、負または正または 0 を返します。必ずしも 1 または -1 とは限りません。

何らかの形で compareToIgnoreCase からゼロ以外の値を取得していることは間違いありませんが、それは 1 または -1 ではないため、失敗し、配列の長さが同じで内容が同じであっても 0 を返すことになります。>0 および <0 に対してチェックしてみてください

また、このコードをより適切に整理できます。たとえば、比較を 1 回実行し、結果を保存してから、結果を有効にします。この方法では、コストのかかる 2 つの比較を無料で行うことができます。

于 2009-01-06T02:03:13.047 に答える
0

実際、トリックは、compareTo()のドキュメントが実際に言ったことを読み間違えたということかもしれません...テストされると報告されます。

Aaand、それだけです。人々に感謝します。

于 2009-01-06T02:12:53.743 に答える