[英]Strange behavior of Java's TreeMap put() method
我有以下代碼,它將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個條目。 輸入一個條目(鍵)后,它將保持不變,但是VALUE在掃描過程的每次迭代中都會更改(每次它從文件中的一行中讀取新矢量時)。 它會拋出除兩個鍵以外的所有其他鍵。
我的比較器有問題嗎? 還是TreeMap用put()做我不了解的事情?
回答
不回答
這個問題,有
但
除了你的代碼中的幾個小點:
編輯:Doh! 而且,當然,String.compareToIgnoreCase()的返回值是這三個比較器之一。 正如我在同一時間發布的其他答案所指出的那樣,這很可能是導致錯誤的原因。
EDIT2:更正了開篇陳述以反映問題,實際上已得到答復。
我不知道這是否是造成您問題的原因,但是Java中的比較函數通常返回負數或正數或0,不一定返回1或-1。
我願意打賭,您以某種方式從compareToIgnoreCase中獲取了一個非零值,但是由於它不是1或-1,因此您會失敗,即使數組長度相同且內容不相等,最終也會返回0。 嘗試檢查> 0和<0
另外,您可以更好地組織此代碼。 例如,進行一次比較,保存結果,然后打開結果。 這樣,您可能會做兩個昂貴的比較。
實際上,技巧可能確實是我誤讀了compareTo()的實際文檔說的……一旦測試將報告。
阿蘭,就是這樣。 謝謝大家
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.