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

时间:2009-01-06 01:57:32

标签: java collections vector treemap

我有以下代码,它将Vector拆分为字符串向量(用作键)和末尾的整数(用作值)。

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

使用具有以下方法的比较器构造所讨论的TreeMap,该方法强制执行词典,不依赖于案例的排序,也考虑了长度(较长的向量总是比较短的向量“更大”)。

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()做了一些我不理解的事情?

3 个答案:

答案 0 :(得分:3)

回答没有回答这个问题,除了代码之外还有几个小问题:

  1. 你不应该两次做compareTo;比较一次并将结果分配给sgn;然后打破if!= 0
  2. 你的继续是多余的。
  3. 您不应该比较-1或1,但是&lt; 0或&gt; 0;许多compareTo方法基于(x1-x2)返回,它可以给出任何负数或正数。
  4. 编辑:Doh!当然,String.compareToIgnoreCase()的返回是那些(3)比较器之一。正如我在其指出的同时发布的另一个答案那样,这可能是导致错误的原因。

    EDIT2:已经更正的开场陈述以反映问题。

答案 1 :(得分:2)

我不知道这是否是您的问题的原因,但是Java中的比较函数通常返回负数或正数或0,不一定是1或-1。

我愿意打赌你以某种方式从compareToIgnoreCase获得非零值,但因为它不是1或-1,所以即使数组的长度相同而不是内容,最终也会返回0。尝试检查&gt; 0和&lt; 0

此外,您可以更好地组织此代码。例如,进行一次比较,保存结果,然后打开结果。这样你就可以做两件昂贵的比较。

答案 2 :(得分:0)

实际上,诀窍可能确实是我误读了compareTo()实际上所说的文件...将在测试后报告。

Aaand,就是这样。谢谢大家。