无法引用超级方法

问题描述 投票:-1回答:3

在我的程序中,我按日期排序对象,但是也有一个选项,从来没有我希望我的列表被订购像这样从不,从不,1/23 / 12,1 / 24 / 12,2 / 2/16。

它命令超越我喜欢的方式,除非它把永远都放在最后。

我通过调用Collections.sort(ArrayList)来命令;我了解到你可以制作一个自定义的比较器,我只想建立一个永远不会是第一个然而我不能引用一个超级运动员它说不能直接调用抽象方法比较(对象,对象)类型比较器<0bject>你是否知道我怎么能让这个工作?有没有更好的方法来排序数组,或者我只需要完全构建它。

class Test2 implements Comparator<Object>
{

@Override
public int compare(Object arg0, Object arg1) {

    // TODO Auto-generated method stub
    int other;
    if (arg0.equals("never")&&!arg1.equals("never"))
    {
        return 1;
    }else if(!arg0.equals("never")&&arg1.equals("never"))
    {

        return -1;
    }else if(arg0.equals("never")&&arg1.equals("never"))
    {

        return 0;
    }else
    {
        other = Comparator.super.compare(arg0,arg1);
    }

    return other;
}

}

java java-8 comparator
3个回答
0
投票

我猜你的'日期'列表实际上是一个String对象列表,目前你正在这样排序:

        List<String> dates = ...;
        Collections.sort(dates);

这是有效的,因为String类实现了Comparable接口。一起

        java.util.Comparator; and
        java.util.Comparable 

是让Collections.sort工作的两种方法。要实现自定义排序,您确实可以像尝试一样实现Comparator,但是您的示例的超类是

        java.lang.Object

这是您无法编译代码的一个原因,因为Object上没有比较(Object,Object)方法。

要引用默认情况下发生的'compare'方法,可以直接使用String compareTo方法。这看起来像这样:

public class NeverComparator implements Comparator<String> {
    private static String NEVER = "never";

    @Override
    public int compare(String o1, String o2) {
        if (NEVER.equals(o1)) {
            return NEVER.equals(o2) ? 0 : -1;
        }
        if (NEVER.equals(o2)) {
            return 1;
        }
        return o1.compareTo(o2);
    }
}

但是说了这个。如果您尝试以这种方式对日期进行排序,您会发现您的示例仅适用于侥幸,您必须做一些工作才能真正比较您的字符串日期。


0
投票

比较器是你正在扩展的类,而不是实现,你要调用的超级是来自自己的对象超级。

 other = Test2.super.compare(arg0,arg1)

但是由于你重写了比较并且类没有超出范围,你可以省略类名(除非在内部类中):

other = super.compare(arg0,arg1)

0
投票

要将"Never"的出现位置移到前面,而不更改其他条目的相对顺序,您可以使用

yourArrayList.sort(Comparator.comparing(s -> !s.equals("Never")));

要将其与按字典顺序排序其他字符串相结合,您可以使用

yourArrayList.sort(Comparator.comparing((String s) -> !s.equals("Never"))
                             .thenComparing(Comparator.naturalOrder()));

这个解决方案相当于

yourArrayList.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int step1 = ((Boolean)!o1.equals("Never")).compareTo(!o2.equals("Never"));
        return step1!=0? step1: o1.compareTo(o2);
    }
});

但必须强调的是,按字典顺序排序字符串不会给出它们包含的日期的时间顺序。要按时间顺序对它们进行排序,无法解析日期,例如

DateTimeFormatter f = DateTimeFormatter.ofPattern("M/d/yy");
List<String> sorted = list.stream()
        .map(s -> s.equals("Never")? null: LocalDate.parse(s, f))
        .sorted(Comparator.nullsFirst(Comparator.naturalOrder()))
        .map(d -> d==null? "Never": f.format(d))
        .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.