JavaのTreeMapのput()メソッドの奇妙な動作
-
03-07-2019 - |
質問
次のコードがあり、ベクターを文字列ベクター(キーとして使用する)と最後の整数(値として使用する)に分割します。
payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));
問題のTreeMapは、Comparatorと次のメソッドを使用して構築されます。このメソッドは、長さも考慮した辞書式の大文字と小文字を区別しない順序付けを行います(長いベクトルは常に短いベクトルよりも<!> quot; greater <!> quot; )。
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つのエントリ(キー)が入力されると、STAYSになりますが、スキャンプロセスの反復ごとに(ファイルの行から新しいベクトルを読み込むたびに)VALUEが変化します。 2つを除く他のすべてのキーを破棄します。
これは私のコンパレータの問題ですか?または、TreeMapはput()で理解できないことをしていますか?
解決
Answwering Answering answering 、 but について、コードについてのいくつかの小さな点:
- compareToを2回実行しないでください。一度比較して、結果をsgnに割り当てます。 != 0の場合は中断します
- 他の続行は冗長です。
- -1または1ではなく、<!> lt; 0または<!> gt; 0を比較する必要があります。多くのcompareToメソッドは、(x1-x2)に基づいて戻ります。これにより、任意の負または正の数が得られます。
編集:Doh!そして、もちろん、String.compareToIgnoreCase()の戻り値は、これらの(3)コンパレーターの1つです。私の投稿と同時に投稿された他の回答が指摘したように、それがエラーの原因である可能性があります。
EDIT2:実際に回答された質問を反映するために、オープニングステートメントを修正しました。
他のヒント
これが問題の原因かどうかはわかりませんが、Javaの比較関数は通常、負または正または0を返します。必ずしも1または-1ではありません。
compareToIgnoreCaseからなんらかの方法でゼロ以外の値を取得していることは間違いありませんが、1または-1ではないため、配列の長さが同じでコンテンツがなくても0を返すことになります。 <!> gt; 0および<!> lt; 0
をチェックしてみてくださいまた、このコードをより適切に編成できます。たとえば、1つの比較を行い、結果を保存してから、結果をオンにします。この方法では、2つの高価な比較を無料で実行できます。
実際には、compareTo()のドキュメントが実際に言っているのを読み間違えるというトリックかもしれません...テスト後に報告します。
Aaand、それだけです。人々に感謝します。