java - 比较向量中的两个对象字符串
问题描述
我必须编写我自己的compareTo()
-Method 来为 Objects 命名的词法顺序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
并对其进行排序。它仅针对前两个元素执行此操作,仅此而已。
任何人都可以帮忙吗?或者告诉我,我的错误在哪里?
解决方案
你的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);
}
请注意,它可以针对空检查和其他好东西进行增强。
您的啤酒将按类型和名称按字母升序排序。
经测试
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);
推荐阅读
- c# - 当没有调整大小和大小限制时,为什么窗口会在输出中重新缩放/缩小?
- c++ - 基于堆栈操作c ++计算元素的最大值
- php - 如何检查方法是否已定义?
- python - 根据多个数据帧中的多个条件更新列值
- zend-framework - 理解 Zend\Form\Element\Date
- azure - 关于使用 Terraform 部署到 Azure 的问题
- amazon-web-services - AWS - 从 VPC 内的 Lambda 函数向 SQS 发送消息
- regex - 正则表达式加载整数个“键值”对,例如 3 key1“value1”key2“value2”key3“value3”
- angular - 角度 5 中 ng-multiselect-dropdown 的验证
- sql - 来自 XML 的数据填充问题