2

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

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 个条目。一旦输入了一个条目(键),它就会保留,但值会随着扫描过程的每次迭代而改变(每次它从文件中的一行读取一个新向量)。它会抛出除两个之外的所有其他键。

这是我的比较器的问题吗?或者 TreeMap 是否在用 put() 做一些我不理解的事情?

4

3 回答 3

4

回答不回答问题,除了关于您的代码之外,还有一些小问题

  1. 你不应该做 compareTo 两次;比较一次并将结果分配给sgn;如果 !=0 则中断
  2. 你的 else continue 是多余的。
  3. 您不应该比较 -1 或 1,而是 <0 或 >0;许多 compareTo 方法基于 (x1-x2) 返回,它可以给出任何负数或正数。

编辑:哇!而且,当然, String.compareToIgnoreCase() 的返回是那些 (3) 比较器之一。正如我在同一时间发布的另一个答案指出的那样,这可能是您错误的原因。

EDIT2:更正了开场白以反映问题实际上得到了回答。

于 2009-01-06T02:06:02.073 回答
2

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

我敢打赌,您会以某种方式从 compareToIgnoreCase 获得一个非零值,但是因为它不是 1 或 -1,所以即使数组长度相同且内容不同,最终也会返回 0。尝试检查 >0 和 <0

此外,您可以更好地组织此代码。例如,进行一次比较,保存结果,然后打开结果。这样一来,您可能会无所事事地进行两次昂贵的比较。

于 2009-01-06T02:03:13.047 回答
0

实际上,诀窍可能确实是我误读了 compareTo() 实际所说的文档......一旦测试就会报告。

Aaand,就是这样。谢谢人们。

于 2009-01-06T02:12:53.743 回答