根据当前日期对日期数组进行排序

时间:2013-12-09 08:01:02

标签: java arrays sorting date

我有一个数组:

| YYYY-MM-DD || YYYY-MM-DD || YYYY-MM-DD || ... || ... || ...

现在我在系统中查询当前日期,并根据这个日期,我希望我的数组被排序,年份与月份和日期无关。我希望索引0处的最近日期和最后的最远日期。

比如说有三个日期1999-04-04,1789-03-01,2012-05-04

如果是四月份: 排序的数组应该像

1999-04-04,2012-05-04,1789-03-01。

我正在寻找逻辑,而不是要求做我的功课。我读了很多关于这个主题的内容,但我无法设计出一条道路。帮助将受到高度赞赏。

4 个答案:

答案 0 :(得分:1)

实施java.util.Comparator。比较器可以在构造函数中获取日期并将其作为参考日期存储在属性中。然后,compare()方法可以决定哪个传递日期更接近参考日期(根据您喜欢的 close 的任何定义)。

然后可以将该编译器与数组一起传递给Array.sort(T[] a, Comparator<? super T> c)

答案 1 :(得分:1)

您肯定希望实现java.util.Comparator并将其传递给排序方法。其中的代码实际上应该比较候选人和当前日期之间天数的绝对差异。

答案 2 :(得分:1)

  

我想要对我的阵列进行排序,这一年与月份和日期无关   是重要的。我希望索引0和最远的日期最近   最后一次。

您需要先根据月份和日期进行排序:比较任何两个日期ঃ

首先对日期列表进行排序:

  1. 比较月份,如果不相等则返回差异(month1 - month2)作为比较结果
  2. 如果月份相等,则返回月份的差异作为比较结果
  3. 所实施的compareTo(Date o)的{​​{1}}函数如下所示:

    Comparable<Date>

    排序后你可以围绕列表,认为它是循环的。例如,假设排序列表(不包括年份,因为它不相关):

        @Override
        public int compareTo(Date o) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(this.date);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(o);
    
        int month1 = cal1.get(Calendar.MONTH); 
        int month2 = cal2.get(Calendar.MONTH);
    
        if(month1 < month2) 
          return -1;
        else if(month1 == month2) 
          return cal1.get(Calendar.DAY_OF_MONTH) - cal2.get(Calendar.DAY_OF_MONTH);
    
        else return 1; 
    
      }
    

    如果我们的支点(截止日期与日期相比)为JAN 20, FEB 5, SEP 18, OCT 9, OCT 20, NOV 23 ,则选择即时较大(大于枢轴的最小日期)日期为OCT 11。你可以使用for循环找到它。现在,我们只需要围绕它认为它是循环的:

    OCT 20

    正式地,找到与基于月和日的数据透视表相比更大的日期的索引OCT 20, NOV 23 --> JAN 20, FEB 5, SEP 18, OCT 9 (尝试使用compareTo示例),然后创建一个新的列表,从索引{{1开始插入元素{}}到i然后in-1,此处0是日期列表的大小。

答案 3 :(得分:1)

编码实际上比解释更简单:

Arrays.sort(array, new Comparator<Date>()
{
    Calendar now = Calendar.getInstance();

    @Override
    public int compare(Date d1, Date d2)
    {
        Calendar c1 = Calendar.getInstance();
        c1.setTime(d1);
        c1.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d1

        Calendar c2 = Calendar.getInstance();
        c2.setTime(d2);
        c2.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d2

        Long distance1 = Long.MAX_VALUE;
        Long distance2 = Long.MAX_VALUE;

        for(int i : new Integer[] { -1, 0, 1 })
        {
            c1.set(Calendar.YEAR, now.get(Calendar.YEAR) + i);
            c2.set(Calendar.YEAR, now.get(Calendar.YEAR) + i);

            Long temp1 = Math.abs(c1.getTimeInMillis() - now.getTimeInMillis());
            Long temp2 = Math.abs(c2.getTimeInMillis() - now.getTimeInMillis());

            distance1 = Math.min(distance1, temp1);
            distance2 = Math.min(distance2, temp2);
        }

        return distance1.compareTo(distance2);
    }
});