我在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。
结果是
amelia,Fang,george,megan,George Wash。
如果我在比较器中有一个忽略的情况,为什么它推动George Wash到底?
getName方法。
public String getName(){ 返回名称; }
两个字符串之间有空格的任何名字如George Wash(在George和Wash之间有空格)会到列表的末尾。为什么会这样?
答案 0 :(得分:2)
我假设您的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
答案 1 :(得分:0)
数据中有趣的字符/空格?海报的代码有@Override,并没有任何错误。与equals()/ hashCode()
不同,默认情况下不会有Object方法 - 所以这不是正在发生的事情。
我认为这可能是数据错误。
在Comparator方法&amp;中放入一些记录或断点。看看那里发生了什么。
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;
}
}
记录是你的朋友。