我正在尝试编写一个Comparator
来比较两个对象,这两个对象基于它们包含的某个类别字段。作为编写自定义Comparator
的新手,我无法正确排序。我的代码如下:
@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.sort(listOfEvents,myComparator)
。
答案 0 :(得分:0)
您的代码似乎正确无误。但是,如何让它更简洁:
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;
这将完全按照您的方法执行,但它更短,更易于阅读(恕我直言)并且效率更高,因为它只调用equals
两次。
答案 1 :(得分:-1)
你是什么意思:
刚开始编写自定义比较器,我无法对它们进行排序 正常。
无论如何,从我的角度来看两个通知:
两者:date1& date2未使用,是否需要?
在我看来,类别变量是一个字段,对吧?如果是,那么它就是你问题的根源。由于compare
方法不应考虑任何字段,因此只有两个比较对象。
最后一点提示:编写Comparator
实际上是一项微不足道的任务;)您只需要返回零,大于零或小于零的整数。这就是全部。
请查看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;
}