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本身。。。