Java 编写正确的比较器
我试图编写一个比较器,根据两个对象包含的某个类别字段来比较它们。由于不熟悉编写自定义比较器,我无法对它们进行正确排序。我的代码如下:Java 编写正确的比较器,java,collections,Java,Collections,我试图编写一个比较器,根据两个对象包含的某个类别字段来比较它们。由于不熟悉编写自定义比较器,我无法对它们进行正确排序。我的代码如下: @Override public int compare(ParseObject event1, ParseObject event2) { String cat1 = event1.getString(Fields.CATEGORY); String cat2 = event2.getString(Fields.CATEGORY); D
@Override
public int compare(ParseObject event1, ParseObject event2)
{
String cat1 = event1.getString(Fields.CATEGORY);
String cat2 = event2.getString(Fields.CATEGORY);
Date date1 = event1.getDate(Fields.EVENT_DATE);
Date date2 = event1.getDate(Fields.EVENT_DATE);
if(cat1.equals(category) && !cat2.equals(category))
{
// If event1 matches the category and event2 doesnt
// event1 is greater
Log.v("COMPARING", cat1 + " with " + cat2 + ", " + cat1 + " is greater ");
return 1;
}
else if(!cat1.equals(category) && cat2.equals(category))
{
// If event1 doesnt match the category and event2 does
// event1 is lesser
Log.v("COMPARING", cat1 + " with " + cat2 + ", " + cat1 + " is lesser ");
return -1;
}
else if(cat1.equals(category) && cat2.equals(category))
{
// If both belong to the same category
Log.v("COMPARING", cat1 + " with " + cat2 + ", " + cat1 + " is equal ");
return 0;
}
else
{
// Else they both do not belong to the category
// return 0
return 0;
}
}
我使用了一个简单的两位二进制表00,01,10,11来给出条件。这是编写比较器的正确方法吗?我把条件弄得太复杂了,有没有犯过什么错误
案例1查找车间事件:车间事件被下推到列表中
具有研讨会类别的活动更大
07-23 16:08:47.399: V/COMPARING(17806): Workshops
07-23 16:08:47.399: V/COMPARING(17806): Workshops with Workshops, Workshops is equal
07-23 16:08:47.399: V/COMPARING(17806): Fests with Workshops, Fests is lesser
07-23 16:08:47.399: V/COMPARING(17806): Fests with Workshops, Fests is lesser
07-23 16:08:47.399: V/COMPARING(17806): Fests with Workshops, Fests is lesser
07-23 16:08:47.399: V/COMPARING(17806): Workshops with Workshops, Workshops is equal
07-23 16:08:47.399: V/COMPARING(17806): Workshops with Workshops, Workshops is equal
案例2寻找节日活动:根本没有比较
07-23 16:10:13.639: V/COMPARING(17806): Fests
我正在使用Collections.sortlistOfEvents,myComparator。您的代码似乎正确。但是,让它更简洁一点怎么样:
String cat1 = event1.getString(Fields.CATEGORY);
String cat2 = event2.getString(Fields.CATEGORY);
int c1 = cat1.equals(category) ? 1 : 0;
int c2 = cat2.equals(category) ? 1 : 0;
return c1 - c2;
这与您的方法完全一样,但它更简短、更易于阅读,而且效率更高,因为它只调用了等于两次的函数。您所说的:
由于不熟悉编写自定义比较器,我无法对它们进行排序
对
无论如何,在我看来,有两个注意事项:
date1和date2都未使用,是否需要
在我看来,类别变量是一个字段,对吗?如果是的话,那就是你问题的根源。因为比较方法不应该考虑任何字段,所以只有两个比较对象
最后一个提示:编写比较器真的是一项微不足道的任务;您只需要返回零、大于零或小于零的整数。这就是全部。
请看java.lang.Integer.compare的源代码示例
编辑,您可以查看下面的代码:
public class ParseObject implements Comparable<ParseObject> {
@Override
public int compareTo (ParseObject o) {
String cat1 = this.getString (Fields.CATEGORY);
String cat2 = o.getString (Fields.CATEGORY);
return cat1.compareTo (cat2);
}
public String getString(Fields field) {
return "some string"; // TODO
}
}
enum Fields {
CATEGORY, EVENT_DATE;
}
类别从何而来?您希望最后的订单是什么?为什么不把cat1和cat2进行比较呢?这看起来并不是不正确的,尽管这是不寻常的-大多数人可能不会使用比较器来查找项目,而只是对它们进行排序,例如按字母顺序排序时category@FlorentBayle类别是来自服务器的ParseObject中的字段。我仔细检查了服务器上的数据是否有错误。没有。。我期望的顺序是,任何与给定类别匹配的事件都会移动到列表的开头。cat1和cat2?怎么会这样?@immibis有一个不同的逻辑,我可以使用:@LittleChild的典型代码是List result=new ArrayList;forParseObject对象:列出ifobject.getCategory.equalscategory结果.addobject;或者使用Java8Lambdas的更短的东西;Java8似乎还没有被广泛安装,所以我避免使用它。那么,如何将具有匹配类别的事件移动到列表的开头?一种方法是从列表中删除它们,然后将它们添加回起始位置。这看起来更像是一个黑客而不是一个实际的解决方案是的,这是一个领域。但是,如果不基于某个字段,如何真正比较两个对象@LittleChild您应该只比较两个对象中的字段,而不比较其他对象。@LittleChild和第二个:Comparator本身不应该对任何内容进行排序。例如,Collections.sort可以按照比较器指示的顺序对某物进行排序@LittleChild:在任何允许将布尔转换为int的语言中,这甚至都不是必需的;我们可以简单地使用bool本身。。。