无法引用超级方法
Can't reference a super method
在我的程序中,我按日期对对象进行排序,但是还有一个选项是从不,我希望我的列表这样排序 Never,Never,1/23/12,1/24/12,2 /2/16。
它按我喜欢的方式排序,除了它把 never 放在最后。
我正在通过调用 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;
}
}
Comparator是你扩展的class,不是实现,你要调用的super是从自己的对象super.
other = Test2.super.compare(arg0,arg1)
但是由于您正在覆盖比较并且 class 没有超出范围,您可以省略 class 名称(除非在内部 class 中):
other = super.compare(arg0,arg1)
我猜你的 'dates' 列表实际上是一个 String 对象列表,目前你是这样排序的:
List<String> dates = ...;
Collections.sort(dates);
这是有效的,因为 String class 实现了 Comparable 接口。在一起
java.util.Comparator; and
java.util.Comparable
是让 Collections.sort 工作的两种方法。要实现自定义排序,您确实可以像您尝试的那样实现 Comparator,但是您的示例的超级 class 是
java.lang.Object
这是您无法编译代码的原因之一,因为 Object 上没有 compare(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);
}
}
话虽如此。如果您尝试以这种方式对日期进行排序,您会发现您的示例只能靠侥幸工作,您将不得不做一些工作才能正确比较字符串日期。
要将出现的 "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());
在我的程序中,我按日期对对象进行排序,但是还有一个选项是从不,我希望我的列表这样排序 Never,Never,1/23/12,1/24/12,2 /2/16。
它按我喜欢的方式排序,除了它把 never 放在最后。
我正在通过调用 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;
}
}
Comparator是你扩展的class,不是实现,你要调用的super是从自己的对象super.
other = Test2.super.compare(arg0,arg1)
但是由于您正在覆盖比较并且 class 没有超出范围,您可以省略 class 名称(除非在内部 class 中):
other = super.compare(arg0,arg1)
我猜你的 'dates' 列表实际上是一个 String 对象列表,目前你是这样排序的:
List<String> dates = ...;
Collections.sort(dates);
这是有效的,因为 String class 实现了 Comparable 接口。在一起
java.util.Comparator; and
java.util.Comparable
是让 Collections.sort 工作的两种方法。要实现自定义排序,您确实可以像您尝试的那样实现 Comparator,但是您的示例的超级 class 是
java.lang.Object
这是您无法编译代码的原因之一,因为 Object 上没有 compare(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);
}
}
话虽如此。如果您尝试以这种方式对日期进行排序,您会发现您的示例只能靠侥幸工作,您将不得不做一些工作才能正确比较字符串日期。
要将出现的 "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());