【问题标题】:Creating a comparator class to sort an ArrayList<Date>创建一个比较器类对 ArrayList<Date> 进行排序
【发布时间】:2014-01-14 03:20:48
【问题描述】:

我正在尝试对 ArrayList 对象中的日期进行排序。为此,我使用排序,其中 dateList 是我的 ArrayList 对象:

Collections.sort(dateList, new DateComparator());

我尝试使用以下 Comparator 类来做到这一点:

class DateComparator implements Comparator {
    int compare(Object a, Object b) {
        Date x = (Date) a;
        Date y = (Date) b;

        if (x > y) {
            return 1;}
        else if (x == y) {
            return 0;}
        else if (x < y) {
            return 1;
        }
    }
}

但是,这给了我以下错误:

1) 无法实现 compare(T,T) - 试图分配较弱的访问权限;在接口 Comparator 中声明的 T 扩展对象是公共的

2) 二元运算符 '>' 的错误操作数类型: if (x>y) { 第一种:日期第二种:日期

3) 二元运算符 '

关于出了什么问题有什么想法吗?

干杯

【问题讨论】:

  • 首先,你不能在日期上使用 。
  • 为什么不将日期转换为完整毫秒,然后使用 >,
  • x &gt; y 更改为x.after(y) 等。另外,不要使用== - 使用equals。查看class Date的文档
  • 你的第一个问题是不知道如何使用泛型引起的。总的来说,阅读 oracle 的教程应该涵盖你所有的问题docs.oracle.com/javase/tutorial/collections/interfaces/…

标签: java sorting date arraylist


【解决方案1】:

如果您这样做不是为了好玩或为了学习,如果我们实际上是在谈论 java.util.Date 并且您确实想要一个自然比较,那么您可能会喜欢要知道Date 已经implements Comparable&lt;Date&gt;(见its javadoc entry)。

这意味着,如果您不指定任何 Comparator... 您将获得预期的行为 :)

只需使用Collections.sort(dateList); 即可。这是javadoc entry for Collections#sort

【讨论】:

  • 虽然该信息当然很好理解,但我不确定“精确”一词在倒数第二段的上下文中是什么意思。您的意思是“指定”之类的意思吗?
  • 糟糕!这正是我的意思...非常感谢您指出:)
  • 很高兴为您提供帮助。;)很好的答案。
【解决方案2】:

这样做

class DateComparator implements Comparator<Date> {
    @Override
    public int compare(Date o1, Date o2) {
        return o1.compareTo(o2);
    }  
}

【讨论】:

    【解决方案3】:

    你可以试试这个

    if(date1.compareTo(date2)>0) System.out.println("Date1 is after Date2"); else if(date1.compareTo(date2) System.out.println("Date1 is before Date2"); else if(date1.compareTo(date2)==0) System.out.println("Date1 is equal to Date2"); `

    【讨论】:

      【解决方案4】:

      试试下面的代码:

      import java.util.Comparator;
      import java.util.Date;
      
      public class DateComparator implements Comparator<Date>{
      
          @Override
          public int compare(Date o1, Date o2) {
      
              long t1 = o1.getTime();
              long t2 = o2.getTime();
      
              if(t1 < t2) {
                  return -1; 
              } else if(t2 > t2) {
                  return 1;
              }
              return 0;
          }
      
      }
      

      Date对象之间的比较很简单,只要将它们转换成long值,然后比较对应的整数即可。

      更重要的是,java.util.Date 实现了 java.lang.Comparable 本身。所以 date1.compareTo(date2) 会返回你想要的值。

      DataComparator 是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2018-11-25
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多