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

Java的奇怪行为';s TreeMap put()方法,java,collections,vector,treemap,Java,Collections,Vector,Treemap,我有下面的代码,它将向量拆分为字符串向量(用作键)和结尾的整数(用作值) payofs.put(新向量(keyAndOutput.subList(0,keyAndOutput.size()-1)),Integer.parseInt(keyAndOutput.lastElement()); 所讨论的树状图是使用比较器和以下方法构建的,该方法采用了词典学的、与大小写无关的顺序,也考虑了长度(较长的向量总是比较短的向量“大”) 公共整数比较(向量arg0、向量arg1){ int-sgn=0; 如果

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

payofs.put(新向量(keyAndOutput.subList(0,keyAndOutput.size()-1)),Integer.parseInt(keyAndOutput.lastElement());
所讨论的树状图是使用比较器和以下方法构建的,该方法采用了词典学的、与大小写无关的顺序,也考虑了长度(较长的向量总是比较短的向量“大”)

公共整数比较(向量arg0、向量arg1){ int-sgn=0; 如果(arg0.size()>arg1.size()){ 返回1; }else if(arg0.size() 现在,为了解决这个问题…尽管在这个被读取的文本文件中有8个条目,但映射最多只能得到2个条目。输入一个条目(键)后,它将保持不变,但该值会随着扫描过程的每次迭代而变化(每次它从文件中的一行读入新向量时)。它扔掉了除两把钥匙以外的所有其他钥匙


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

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

我敢打赌,你会从CompareTignoreCase中得到一个非零值,但因为它不是1或-1,你会失败,并最终返回0,即使数组长度相同,内容也不相同。试着对照>0和回答而不是回答问题,除了代码之外,还有几点小问题:

  • 你不应该做两次比较;比较一次并将结果分配给sgn;那就休息吧=0
  • 你的else continue是多余的
  • 不应比较-1或1,而应比较0;许多compareTo方法基于(x1-x2)返回,它可以给出任何负数或正数
  • 编辑:Doh!当然,String.compareToIgnoreCase()的返回是这(3)个比较器之一。正如我在同一时间发布的另一个答案所指出的那样,这很可能是你错误的原因


    编辑2:更正了开场白,以反映问题得到了实际回答。

    事实上,技巧可能确实是我误读了compareTo()文档中实际说的内容……一旦测试,将报告

    啊,就是这样。谢谢大家

    payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));
    
    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;
        }