写一个正确的比较器

时间:2014-07-23 10:36:38

标签: java collections

我正在尝试编写一个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)

2 个答案:

答案 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;
}