更新时间:2023-01-07 08:23:16
ArrayList<Course> list = new ArrayList<>();
list.add( new Course(350, "5/20/2020") );
list.add( new Course(350, "4/20/2019") );
list.add( new Course(350, "3/20/2018") );
list.add( new Course(360, "6/20/2020") );
list.add( new Course(360, "5/20/2019") );
list.add( new Course(370, "5/20/2020") );
list.add( new Course(370, "5/19/2018") );
list.add( new Course(360, "4/10/2016") );
// Find latest date for each course number
Map<Integer, LocalDate> latestDates = new HashMap<>();
for (Course currentCourse : list) {
LocalDate latestHitherto = latestDates.get(currentCourse.getCourseNumber());
if (latestHitherto == null || currentCourse.getDate().isAfter(latestHitherto)) {
latestDates.put(currentCourse.getCourseNumber(), currentCourse.getDate());
}
}
// Remove courses that haven’t got the latest date
Iterator<Course> courseIterator = list.iterator();
while (courseIterator.hasNext()) {
Course currentCourse = courseIterator.next();
if (currentCourse.getDate().isBefore(latestDates.get(currentCourse.getCourseNumber()))) {
courseIterator.remove();
}
}
// Print result
for (Course currentCourse : list) {
System.out.format("%3d %s%n",
currentCourse.getCourseNumber(),
currentCourse.getDate().format(Course.dateFormatter));
}
此代码段的输出为:
350 5/20/2020
360 6/20/2020
370 5/20/2020
我在jdk1.7.0_67上运行.我添加了ThreeTen Backport 1.3.6.请参阅下面的链接.
I ran on jdk1.7.0_67. I had added ThreeTen Backport 1.3.6. See the link below.
这是我使用的 Course
类:
public class Course {
public static final DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("M/d/u");
private int courseNumber;
private LocalDate date;
public Course(int courseNumber, String dateString) {
this.courseNumber = courseNumber;
this.date = LocalDate.parse(dateString, dateFormatter);
}
public int getCourseNumber() {
return courseNumber;
}
public LocalDate getDate() {
return date;
}
}
如果您坚持使用 java.util.Date
(一个设计不良且过时的类),(1)我不明白为什么会这样,(2)您可以将我的代码修改为改用 Date
.
If you insist on using java.util.Date
— a poorly designed and long outdated class — (1) I would not understand why you would, (2) you can probably modify my code to use Date
instead.
您可能需要考虑升级Java版本.Java 15已经发布,并且是Java 16的早期访问版本.Java8已经出现了流.它们将使您可以用更少的代码行来获得相同的代码:
You may want consider upgrading your Java version. Java 15 is out, and an early access edition of Java 16. Already in Java 8 comes streams. They will allow you to obtain the same in much fewer lines of code:
Collection<Course> filteredCourses = list.stream()
.collect(Collectors.groupingBy(Course::getCourseNumber,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Course::getDate)),
Optional::orElseThrow)))
.values();
List<Course> filteredList = new ArrayList<>(filteredCourses);
filteredList.forEach(c -> System.out.format(
"%3d %s%n", c.getCourseNumber(), c.getDate().format(Course.dateFormatter)));
370 5/20/2020
360 6/20/2020
350 5/20/2020
按照代码的原样,它在结果列表中给出的课程顺序并不相同,并且需要Java 10(此处介绍了覆盖过的no-arg orElseThrow
方法).即使您需要相同的订单,流仍然将非常有帮助.
As the code stands it doesn’t give the same order of courses in the resulting list, and it requires Java 10 (the overlaoded no-arg orElseThrow
method was introduced there). Even if you require the same order, streams will still be extremely helpful.
java.time在旧的和更新的Android设备上均可正常运行.它只需要至少 Java 6 .
java.time works nicely on both older and newer Android devices. It just requires at least Java 6.
org.threeten.bp
导入日期和时间类.org.threeten.bp
with subpackages. java首先描述了.time
. java.time
的反向端口Java 6和7(JSR-310的ThreeTen).java.time
was first described.java.time
to Java 6 and 7 (ThreeTen for JSR-310).