我必须编写自己的compareTo()
-方法来为称为Beer
的对象按词法排序,该方法将Beer
按啤酒类型和啤酒名称进行比较。
这是我的compareTo
方法:
@Override
public int compareTo(Beer b) {
String compareBeer1 = this.getBeerType() + this.getbName();
String compareBeer2 = b.getBeerType() + b.getbName();
for(int i = 0; i < compareBeer1.length(); i++) {
if(compareBeer1.charAt(i) > compareBeer2.charAt(i)) {
return compareBeer1.charAt(i) - compareBeer2.charAt(i);
} else if(compareBeer1.equals(compareBeer2)) {
return 0;
} else if((compareBeer1.charAt(i) == compareBeer2.charAt(i)) && (compareBeer1.length() - compareBeer2.length()) > 0){
return compareBeer1.length() - compareBeer2.length();
}
}
return -1;
}
到目前为止,到目前为止,我的问题是我有一个Vector<Beer> filteredBeer
,我也必须按词法顺序对其进行排序。因此,我的代码是:
Collections.sort(filteredBeer, new Comparator<Beer>() {
public int compare(Beer beer1, Beer beer2) {
return beer1.compareTo(beer2);
}
});
不过,我没有得到想要的结果,它没有对整个Vector
进行比较和排序。它仅对前两个元素执行操作,仅此而已。
有人可以帮忙吗?还是告诉我,我的错误在哪里?
答案 0 :(得分:1)
您的compareTo
方法很奇怪。
您只需要这个
@Override
public int compareTo(final Beer b) {
final var compareBeer1 = getBeerType().trim() + getName().trim();
final var compareBeer2 = b.getBeerType().trim() + b.getName().trim();
return compareBeer1.compareTo(compareBeer2);
}
请注意,可以对null检查和其他好东西进行增强。
您的啤酒将按类型和名称按字母升序排列。
经过测试
final List<Beer> beers = new ArrayList<>();
beers.add(new Beer("tre", "nome2"));
beers.add(new Beer("due", "snome2"));
beers.add(new Beer("uno", "nome1"));
beers.add(new Beer("uno", "nome5"));
beers.add(new Beer("uno", "nome4"));
beers.add(new Beer("uno", "nome2"));
beers.add(new Beer("due", "nome1"));
Collections.sort(beers, Beer::compareTo);
答案 1 :(得分:0)
compareTo取决于Beer的equals()方法。 看起来Beer的equals()方法没有正确重写(或根本没有重写?),在这种情况下,它依赖于Object的实现...