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

Java 根据当前日期对日期数组进行排序,java,arrays,sorting,date,Java,Arrays,Sorting,Date,我有一个数组: |YYYY-MM-DD | YYYY-MM-DD | YYYY-MM-DD | | | | | | | 现在,我在系统中查询当前日期,并根据该日期对数组进行排序,年份与日期无关,月份和日期很重要。我希望最近的日期在索引0处,最远的日期在最后 例如,假设有三个日期1999-04-041789-03-012012-05-04 如果是4月份: 排序后的数组应该是 1999-04-042012-05-041789-03-01 我在寻找逻辑,而不是要求做作业。关于这个问题我读了很多书,但我

我有一个数组:

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

现在,我在系统中查询当前日期,并根据该日期对数组进行排序,年份与日期无关,月份和日期很重要。我希望最近的日期在索引0处,最远的日期在最后

例如,假设有三个日期1999-04-041789-03-012012-05-04

如果是4月份: 排序后的数组应该是

1999-04-042012-05-041789-03-01

我在寻找逻辑,而不是要求做作业。关于这个问题我读了很多书,但我无法想出一条路来。非常感谢您的帮助

实施一种新的方法。比较器可以在构造函数中获取一个日期,并将其作为引用日期存储在属性中。然后,该方法可以决定哪个传递的日期更接近参考日期(根据您喜欢的关闭定义)

然后,comperator可以与数组一起传递,以实现。比较器可以在构造函数中获取一个日期,并将其作为引用日期存储在属性中。然后,该方法可以决定哪个传递的日期更接近参考日期(根据您喜欢的关闭定义)


comperator可以与数组一起传递给

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

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

我希望对数组进行排序,年份与月份和日期无关 这些都很重要。我想要索引0处最近的日期和最远的日期 上次约会

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

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

  • 比较月份,如果不相等,则返回差值(month1-month2)作为比较结果
  • 如果月份相等,则返回当月的日差作为比较结果
  • 因此,
    compareTo(日期o)
    已实现的
    Comparable
    函数如下所示:

        @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; 
    
      }
    
    如果我们的透视图(与日期相比的截止日期)是
    10月11日
    ,则选择比透视图大的最短日期,即
    10月20日
    。您可以使用for循环找到它。现在,我们只需要把它圆化,认为它是圆形的:

    OCT 20, NOV 23 --> JAN 20, FEB 5, SEP 18, OCT 9
    
    正式地说,根据月份和日期,找到比我们的轴心更大的日期的索引
    i
    (尝试使用compareTo示例),然后创建一个新列表,从索引
    i
    开始插入元素到
    n-1
    ,然后从
    0
    i-1
    ,此处
    n
    是日期列表的大小

    我希望对数组进行排序,年份与月份和日期无关 这些都很重要。我想要索引0处最近的日期和最远的日期 上次约会

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

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

  • 比较月份,如果不相等,则返回差值(month1-month2)作为比较结果
  • 如果月份相等,则返回当月的日差作为比较结果
  • 因此,
    compareTo(日期o)
    已实现的
    Comparable
    函数如下所示:

        @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; 
    
      }
    
    如果我们的透视图(与日期相比的截止日期)是
    10月11日
    ,则选择比透视图大的最短日期,即
    10月20日
    。您可以使用for循环找到它。现在,我们只需要把它圆化,认为它是圆形的:

    OCT 20, NOV 23 --> JAN 20, FEB 5, SEP 18, OCT 9
    

    正式地说,根据月份和日期,找到比我们的轴心更大的日期的索引
    i
    (尝试使用compareTo示例),然后创建一个新列表,从索引
    i
    开始插入元素到
    n-1
    ,然后从
    0
    i-1
    ,这里
    n
    是日期列表的大小。

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

    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);
        }
    });
    
    Arrays.sort(数组,新比较器()
    {
    Calendar now=Calendar.getInstance();
    @凌驾
    公共整数比较(日期d1、日期d2)
    {
    Calendar c1=Calendar.getInstance();
    c1.设定时间(d1);
    c1.set(Calendar.YEAR,now.get(Calendar.YEAR));//年是d1的irrilent
    Calendar c2=Calendar.getInstance();
    c2.设定时间(d2);
    c2.set(Calendar.YEAR,now.get(Calendar.YEAR));//年是d2的irrilent
    长距离1=长最大值;
    长距离2=长最大值;
    for(inti:newinteger[]{-1,0,1})
    {
    c1.设置(日历年,现在。获取(日历年)+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());
    距离1=数学最小值(距离1,时间1);
    距离2=数学最小值(距离2,时间2);
    }
    返回距离1.与(距离2)相比;
    }
    });
    
    实际上,编码比解释更简单:

    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);
        }
    });
    
    Arrays.sort(数组,新比较器()
    {
    Calendar now=Calendar.getInstance();
    @凌驾
    公共整数比较(日期d1、日期d2)
    {
    Calendar c1=Calendar.getInstance();
    c1.设定时间(d1);
    c1.set(Calendar.YEAR,now.get(Calendar.YEAR));//年是d1的irrilent
    Calendar c2=Calendar.getInstance();
    c2.设定时间(d2);
    c2.set(Calendar.YEAR,now.get(Calendar.YEAR));//年是d2的irrilent
    长距离1=长最大值;