簡體   English   中英

Java的TreeMap put()方法的奇怪行為

[英]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()做我不了解的事情?

回答 不回答 這個問題,有 除了你的代碼中的幾個小點:

  1. 您不應兩次執行compareTo; 比較一次並將結果分配給sgn; 如果!= 0則中斷
  2. 您的其他繼續是多余的。
  3. 您不應將-1或1進行比較,而應將<0或> 0進行比較; 許多compareTo方法基於(x1-x2)返回,可以給出任何負數或正數。

編輯:Doh! 而且,當然,String.compareToIgnoreCase()的返回值是這三個比較器之一。 正如我在同一時間發布的其他答案所指出的那樣,這很可能是導致錯誤的原因。

EDIT2:更正了開篇陳述以反映問題,實際上已得到答復。

我不知道這是否是造成您問題的原因,但是Java中的比較函數通常返回負數或正數或0,不一定返回1或-1。

我願意打賭,您以某種方式從compareToIgnoreCase中獲取了一個非零值,但是由於它不是1或-1,因此您會失敗,即使數組長度相同且內容不相等,最終也會返回0。 嘗試檢查> 0和<0

另外,您可以更好地組織此代碼。 例如,進行一次比較,保存結果,然后打開結果。 這樣,您可能會做兩個昂貴的比較。

實際上,技巧可能確實是我誤讀了compareTo()的實際文檔說的……一旦測試將報告。

阿蘭,就是這樣。 謝謝大家

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM