在我的程序中,我按日期排序对象,但是也有一个选项,我从不希望我的列表被订购,从不,从不,1/23 / 12,1 / 24 / 12,2 / 2 / 16。
它命令超越我喜欢的方式,除非它把永远都放在最后。
我通过调用Collections.sort(ArrayList)来命令;我了解到你可以制作一个自定义的比较器,我只是想建立一个永远不会是第一个然而我不能引用一个超级运动者它说不能直接调用类型Comparator< 0bject>类型的抽象方法compare(Object,Object)。你知道我怎么能让这个工作吗?有没有更好的方法来排序数组,或者我只需要完全构建它。
{{1}}
}
答案 0 :(得分:0)
比较器是你要扩展的类,而不是实现,你要调用的超级是来自自己的超级对象。
other = Test2.super.compare(arg0,arg1)
但是由于你重写了比较并且类没有超出范围,你可以省略类名(除非在内部类中):
other = super.compare(arg0,arg1)
答案 1 :(得分: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);
}
}
但是说了这个。如果你试图以这种方式对日期进行排序,你会发现你的例子只适用于侥幸,你必须做一些工作才能真正比较你的字符串日期。
答案 2 :(得分: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());