【问题标题】:Sort Array List by past 3 days按过去 3 天排序数组列表
【发布时间】:2021-10-14 06:54:57
【问题描述】:

我是 java 新手,所以我需要以下场景的帮助。

我有一个存储日期和其他信息的ArrayList,我想打印过去 3 天的日期应该在最前面的数组列表,其余的都在同一个列表之后。

任何帮助将不胜感激。

package learn.java.com;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Person {

private String orderno;
private String itemno;
private Date orderdate;

public String getOrderno() {
    return orderno;
}

public void setOrderno(String orderno) {
    this.orderno = orderno;
}

public String getItemno() {
    return itemno;
}

public void setItemno(String itemno) {
    this.itemno = itemno;
}

public Date getOrderdate() {
    return orderdate;
}

public void setOrderdate(Date orderdate) {
    this.orderdate = orderdate;
}

public Person(String orderno, String itemno, Date orderdate) {
    this.orderno = orderno;
    this.itemno = itemno;
    this.orderdate = orderdate;
}





public static void main(String[] args) throws ParseException {
    ArrayList<Person> list = new ArrayList<>();
    list.add(new Person("099909","BC101", new SimpleDateFormat("dd-MM-yyyy").parse("01-01-2010")));
    list.add(new Person("989878","BC102", new SimpleDateFormat("dd-MM-yyyy").parse("02-01-1990")));
    list.add(new Person("878788","BC103", new SimpleDateFormat("dd-MM-yyyy").parse("03-01-2000")));
    list.add(new Person("099909","BC104", new SimpleDateFormat("dd-MM-yyyy").parse("04-01-2010")));
    list.add(new Person("989878","BC105", new SimpleDateFormat("dd-MM-yyyy").parse("05-01-1990")));
    list.add(new Person("878788","BC106", new SimpleDateFormat("dd-MM-yyyy").parse("06-01-2000")));
    list.add(new Person("099909","BC107", new SimpleDateFormat("dd-MM-yyyy").parse("07-01-2010")));
    list.add(new Person("989878","BC108", new SimpleDateFormat("dd-MM-yyyy").parse("08-01-1990")));
    list.add(new Person("878788","BC109", new SimpleDateFormat("dd-MM-yyyy").parse("09-01-2000")));

    System.out.println("Before Sort");
    for (Person person : list) {
        System.out.println(person.orderno + " " + person.getItemno()+ " " + person.getOrderdate());
    }



   }
  }

“当前输出”

099909 BC101 Fri Jan 01 00:00:00 EST 2010

989878 BC102 Tue Jan 02 00:00:00 EST 1990

878788 BC103 Mon Jan 03 00:00:00 EST 2000

099909 BC104 Mon Jan 04 00:00:00 EST 2010

989878 BC105 Fri Jan 05 00:00:00 EST 1990

878788 BC106 Thu Jan 06 00:00:00 EST 2000

099909 BC107 Thu Jan 07 00:00:00 EST 2010

989878 BC108 Mon Jan 08 00:00:00 EST 1990

878788 BC109 Sun Jan 09 00:00:00 EST 2000

我想看到这样的输出

099909 BC107 Thu Jan 07 00:00:00 EST 2010

989878 BC108 Mon Jan 08 00:00:00 EST 1990

878788 BC109 Sun Jan 09 00:00:00 EST 2000

099909 BC101 Fri Jan 01 00:00:00 EST 2010

989878 BC102 Tue Jan 02 00:00:00 EST 1990

878788 BC103 Mon Jan 03 00:00:00 EST 2000

099909 BC104 Mon Jan 04 00:00:00 EST 2010

989878 BC105 Fri Jan 05 00:00:00 EST 1990

878788 BC106 Thu Jan 06 00:00:00 EST 2000

谢谢

【问题讨论】:

标签: java date sorting arraylist


【解决方案1】:

这是一个简化的示例,使用 Java 流,并将模糊的 Person-Order-LineItem 组合类替换为简单的 Employee 类。

为了简洁起见,我将 Employee 类定义为 Java 16+ record,但并不重要。

record Employee( int id , String name , LocalDate hired ) { }

请注意,我们使用java.time.LocalDate,因为您似乎想要一个没有时间的日期。提示:切勿使用java.util.DateCalendarSimpleDateFormat。这些遗留类在设计上存在严重缺陷,多年前已被 JSR 310 中定义的现代 java.time 类所取代。

创建一些示例数据。

List < Employee > employeeList =
        List.of(
                new Employee( 1 , "Alice" , LocalDate.of( 2021 , Month.AUGUST , 10 ) ) ,
                new Employee( 1 , "Bob" , LocalDate.of( 2021 , Month.AUGUST , 9 ) ) ,
                new Employee( 2 , "Carol" , LocalDate.of( 2021 , Month.AUGUST , 8 ) ) ,
                new Employee( 3 , "Davis" , LocalDate.of( 2021 , Month.JANUARY , 23 ) ) ,
                new Employee( 4 , "Ernestine" , LocalDate.of( 2021 , Month.JANUARY , 24 ) ) ,
                new Employee( 5 , "Frank" , LocalDate.of( 2021 , Month.JANUARY , 25 ) )
        );

确定今天的日期。时区很重要;对于任何给定的时刻,日期在全球范围内因时区而异。

在此演示中,我们将动态确定的日期替换为硬编码日期。

// LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate today = LocalDate.of( 2021 , Month.AUGUST , 10 );
LocalDate threeDaysAgo = today.minusDays( 3 );

筛选聘用日期在过去三天内的Employee 对象。收集到NavigableSet 中,根据我们传递给构造函数的Comparator 维护它们的顺序。

为方便起见,我们使用Comparator.comparing。我们传递了一个method referenceEmployee :: hired,这是编译器为record隐式创建的默认getter方法。

NavigableSet < Employee > recent = new TreeSet <>( Comparator.comparing( Employee :: hired ) );
recent.addAll( employeeList.stream().filter( employee -> ! employee.hired.isBefore( threeDaysAgo ) ).collect( Collectors.toUnmodifiableSet() ) );

通过过滤列表中未在我们的recent 集中找到的对象来确定我们的长期雇员。

NavigableSet < Employee > older = new TreeSet <>( Comparator.comparing( Employee :: hired ) );
older.addAll( employeeList.stream().filter( employee -> ! recent.contains( employee ) ).collect( Collectors.toUnmodifiableSet() ) );

您需要一个列表。因此,将 recent 集添加到新列表中,然后添加 older 集。

将元素添加到列表中的迭代顺序由我们使用保持一定顺序的NavigableSet 实现这一事实控制。

List < Employee > results = new ArrayList <>( employeeList.size() );
results.addAll( recent );
results.addAll( older );

转储到控制台。

System.out.println( "employeeList = " + employeeList );
System.out.println( "recent = " + recent );
System.out.println( "older = " + older );
System.out.println( "results = " + results );

运行时。

employeeList = [员工[id=1,姓名=Alice,受雇=2021-08-10],员工[id=1,姓名=鲍勃,受雇=2021-08-09],员工[id=2,姓名=卡罗尔,受雇=2021-08-08],员工[id=3,姓名=戴维斯,受雇=2021-01-23],员工[id=4,姓名=欧内斯汀,受雇=2021-01-24] , 雇员[id=5, 姓名=弗兰克, 雇用=2021-01-25]]

最近 = [员工[id=2,姓名=Carol,受雇=2021-08-08],员工[id=1,姓名=Bob,受雇=2021-08-09],员工[id=1,姓名=爱丽丝,受雇=2021-08-10]]

年长者 = [员工[id=3,姓名=戴维斯,受雇=2021-01-23],员工[id=4,姓名=Ernestine,受雇=2021-01-24],员工[id=5,姓名=弗兰克,受雇=2021-01-25]]

结果 = [员工[id=2,姓名=Carol,受雇=2021-08-08],员工[id=1,姓名=Bob,受雇=2021-08-09],员工[id=1,姓名=爱丽丝,受雇=2021-08-10],员工[id=3,姓名=戴维斯,受雇=2021-01-23],员工[id=4,姓名=欧内斯汀,受雇=2021-01-24] , 雇员[id=5, 姓名=弗兰克, 雇用=2021-01-25]]

【讨论】:

    【解决方案2】:

    感谢您帮助我,现在正在工作。

    double pastFiveDays = DoubleTime.getDoubleDate(LocalDate.now().minusDays(5));
    
        ArrayList<Header> salesList = list.getSalesHeaders();
            NavigableSet < Header> recent = new TreeSet<>( Comparator.comparing( Header:: getSalesDate ) );
            recent.addAll( salesList.stream().filter( salesorder -> (salesorder.getSalesDate() > pastFiveDays && salesorder.getUnit() !=1))
                    .collect( Collectors.toCollection(ArrayList::new) ) );
    
            NavigableSet < Header> older = new TreeSet <>( Comparator.comparing( Header:: getSalesDate ) );
            older.addAll( salesList.stream().filter( salesorder -> ! recent.contains( salesorder ) && salesorder.getUnit() !=1 )
                    .collect( Collectors.toCollection(ArrayList::new) ) );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多