繁体   English   中英

TreeSet没有正确排序

[英]TreeSet not sorting correctly

我在java中有一个自编写的比较器,用于比较两个名称字符串。

public class NamesSorter implements Comparator<EntityBean>{
    @Override
    public int compare(EntityBean a1, EntityBean a2) {
       return a1.getName().compareToIgnoreCase(a2.getName());
    }
}

使用此分拣机的主要代码

 final Set<EntityBean> treeSet = new TreeSet<EntityBean>(new NamesSorter()); final List<EntityBean> firstListToCompare=display.getAvailablePeople().getItems(); final List<EntityBean> SecondListToCompare=display.getAvailablePeople().getItems(); treeSet.addAll(firstListToCompare); treeSet.addAll(secondListToCompare); 

当我使用以下输入运行此代码时

firstListToCompare amelia,george,megan

secondListToCompare George Wash,Fang。

结果是

阿米莉亚,方,乔治,梅根,乔治华盛顿。

如果我在比较器中有一个忽略的情况,为什么它推动George Wash到底?

getName方法。

public String getName(){return name; }

在两个字符串之间有空格的任何名字就像George Wash(在George和Wash之间有一个空格)一样,列在列表的末尾。为什么会这样?

我假设你的getName()返回一个String 为什么不尝试将toString()添加到getName() 所以试试......

public int compare(EntityBean a1, EntityBean a2) {
   return a1.getName().toString().compareToIgnoreCase(a2.getName().toString());
}

我刚试过你的代码如下,它给了我正确的输出......

public class NamesSorter implements Comparator<Object>{
    public int compare(Object arg0, Object arg1) {
        return (arg0.toString()).compareToIgnoreCase(arg1.toString());
    }
}

public static void main(String[] args) {
    Comp comp = new Comp();
    final Set<Object> treeSet = new TreeSet<Object>(comp.new NamesSorter());
    final List<Object> firstListToCompare = new ArrayList<Object>(); 
    firstListToCompare.add("amelia");
    firstListToCompare.add("george");
    firstListToCompare.add("megan");
    final List<Object> secondListToCompare = new ArrayList<Object>();
    secondListToCompare.add("George Wash");
    secondListToCompare.add("Fang");

    treeSet.addAll(firstListToCompare);
    treeSet.addAll(secondListToCompare);
    for (Iterator<Object> iter = treeSet.iterator(); iter.hasNext(); ) {
        System.out.println((String) iter.next());
    }
}

结果...

amelia
Fang
george
George Wash
megan

数据中有任何有趣的字符/空格? 海报的代码有@Override,并没有任何错误。 equals()/ hashCode() ,默认情况下不会有Object方法 - 所以这不是正在发生的事情。

我认为这可能是数据错误

在Comparator方法中放入一些日志记录或断点,看看那里发生了什么。

public class NamesSorter implements Comparator<EntityBean>{
    @Override
    public int compare (EntityBean a1, EntityBean a2) {
       String name1 = a1.getName();
       String name2 = a2.getName();
       // let's try trimming them..
       name1 = name1.trim();
       name2 = name2.trim();
       int comp = name1. compareToIgnoreCase( name2);
       log.debug("  name CI comparison: "+name1+", "+name2+"="+comp);
       // System.out.println("  name CI comparison: "+name1+", "+name2+"="+comp);
       return comp;
    }
}

记录是你的朋友。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM