对象的java arraylist按日期从arraylist中移除元素

cu6pst1q  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(297)

这是我的数组列表

  1. ArrayList<Courses> list = new ArrayList<Courses>();
  2. list.add( new Courses(350,5/20/2020) );
  3. list.add( new Courses(350,4/20/2019 );
  4. list.add( new Courses(350,3/20/2018) );
  5. list.add( new Courses(360,6/20/2020) );
  6. list.add( new Courses(360,5/20/2019) );
  7. list.add( new Courses(370,5/20/2020) );
  8. list.add( new Courses(370,5/19/2018) );
  9. list.add( new Courses(360,4/10/2016) );
  10. public class Courses{
  11. int coursenum;
  12. Date date;
  13. }

如何删除元素以便arraylist只包含那些最新日期的元素?
我应该喜欢这个;

  1. 350, 5/20/2020}
  2. 360,6/20/2020}
  3. 370, 5/20/2020
bpsygsoo

bpsygsoo1#

我附上我的代码作为你的要求的想法。你可以玩玩它。

  1. public class Courses {
  2. int courseNum;
  3. LocalDate date;
  4. public Courses(int courseNum, LocalDate date) {
  5. this.courseNum = courseNum;
  6. this.date = date;
  7. }
  8. public int getCourseNum() {
  9. return courseNum;
  10. }
  11. public void setCourseNum(int courseNum) {
  12. this.courseNum = courseNum;
  13. }
  14. public LocalDate getDate() {
  15. return date;
  16. }
  17. public void setDate(LocalDate date) {
  18. this.date = date;
  19. }
  20. @Override public String toString() {
  21. return new StringJoiner(", ", Courses.class.getSimpleName() + "[", "]")
  22. .add("courseNum=" + courseNum)
  23. .add("date=" + date)
  24. .toString();
  25. }
  26. public class Main {
  27. public static void main(String[] args) {
  28. List<Courses> list = new ArrayList<>();
  29. list.add(new Courses(350, LocalDate.of(2020, 5, 20)));
  30. list.add(new Courses(350, LocalDate.of(2019, 4, 20)));
  31. list.add(new Courses(350, LocalDate.of(2018, 3, 20)));
  32. list.add(new Courses(360, LocalDate.of(2020, 6, 20)));
  33. list.add(new Courses(360, LocalDate.of(2019, 5, 20)));
  34. list.add(new Courses(370, LocalDate.of(2020, 5, 20)));
  35. list.add(new Courses(370, LocalDate.of(2018, 5, 19)));
  36. list.add(new Courses(360, LocalDate.of(2016, 4, 10)));
  37. List<Courses> res = list.stream().filter(c -> c.getDate().getYear() == 2020).collect(Collectors.toList());
  38. res.forEach(System.out::println);
  39. }
展开查看全部
8hhllhi2

8hhllhi22#

我建议使用java-8中的localdate,因为date是旧版本

  1. public class Courses{
  2. int coursenum;
  3. LocalDate date;
  4. }

然后你可以用 removeIf ```
list.removeIf(d->d.isBefore(LocalDate.now());

dsf9zpds

dsf9zpds3#

Java1.7和java.time通过threeten backport

  1. ArrayList<Course> list = new ArrayList<>();
  2. list.add( new Course(350, "5/20/2020") );
  3. list.add( new Course(350, "4/20/2019") );
  4. list.add( new Course(350, "3/20/2018") );
  5. list.add( new Course(360, "6/20/2020") );
  6. list.add( new Course(360, "5/20/2019") );
  7. list.add( new Course(370, "5/20/2020") );
  8. list.add( new Course(370, "5/19/2018") );
  9. list.add( new Course(360, "4/10/2016") );
  10. // Find latest date for each course number
  11. Map<Integer, LocalDate> latestDates = new HashMap<>();
  12. for (Course currentCourse : list) {
  13. LocalDate latestHitherto = latestDates.get(currentCourse.getCourseNumber());
  14. if (latestHitherto == null || currentCourse.getDate().isAfter(latestHitherto)) {
  15. latestDates.put(currentCourse.getCourseNumber(), currentCourse.getDate());
  16. }
  17. }
  18. // Remove courses that haven’t got the latest date
  19. Iterator<Course> courseIterator = list.iterator();
  20. while (courseIterator.hasNext()) {
  21. Course currentCourse = courseIterator.next();
  22. if (currentCourse.getDate().isBefore(latestDates.get(currentCourse.getCourseNumber()))) {
  23. courseIterator.remove();
  24. }
  25. }
  26. // Print result
  27. for (Course currentCourse : list) {
  28. System.out.format("%3d %s%n",
  29. currentCourse.getCourseNumber(),
  30. currentCourse.getDate().format(Course.dateFormatter));
  31. }

此代码段的输出是:

  1. 350 5/20/2020
  2. 360 6/20/2020
  3. 370 5/20/2020

我在jdk1.7.0\u67上运行。我已经添加了310个backport 1.3.6。请参见下面的链接。
这是你的名字 Course i类使用:

  1. public class Course {
  2. public static final DateTimeFormatter dateFormatter
  3. = DateTimeFormatter.ofPattern("M/d/u");
  4. private int courseNumber;
  5. private LocalDate date;
  6. public Course(int courseNumber, String dateString) {
  7. this.courseNumber = courseNumber;
  8. this.date = LocalDate.parse(dateString, dateFormatter);
  9. }
  10. public int getCourseNumber() {
  11. return courseNumber;
  12. }
  13. public LocalDate getDate() {
  14. return date;
  15. }
  16. }

如果你坚持使用 java.util.Date -一个设计拙劣、过时已久的类-(1)我不明白您为什么要这样做,(2)您可以修改我的代码以使用它 Date 相反。

流版本

您可能需要考虑升级java版本。java15已经发布,java16的早期access版本已经发布。Java8中已经出现了流。它们将允许您以更少的代码行获得相同的结果:

  1. Collection<Course> filteredCourses = list.stream()
  2. .collect(Collectors.groupingBy(Course::getCourseNumber,
  3. Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Course::getDate)),
  4. Optional::orElseThrow)))
  5. .values();
  6. List<Course> filteredList = new ArrayList<>(filteredCourses);
  7. filteredList.forEach(c -> System.out.format(
  8. "%3d %s%n", c.getCourseNumber(), c.getDate().format(Course.dateFormatter)));
  1. 370 5/20/2020
  2. 360 6/20/2020
  3. 350 5/20/2020

从代码的立场来看,它在结果列表中没有给出相同的课程顺序,它需要Java10(覆盖的no arg) orElseThrow 介绍了该方法。即使您需要相同的顺序,streams仍然非常有用。

问:这在Java1.7上能用吗?

java.time在较旧和较新的android设备上都能很好地工作。它至少需要Java6。
在Java8和更高版本以及更新的android设备上(api级别26),现代api是内置的。
在非android的java6和java7中获得了三个十的backport,即现代类的backport(三个十用于jsr310;请参见底部的链接)。
在旧的android上,要么使用desugaring,要么使用android版本的threeten backport。它叫3TENABP。在后一种情况下,请确保从导入日期和时间类 org.threeten.bp 有分装的。

链接

oracle教程:date time解释如何使用java.time。
java规范请求(jsr)310,其中 java.time 第一次被描述。
三十后港工程 java.time 到Java6和Java7(jsr-310为310)。
通过desugaring提供Java8+API
threetenabp,android版threeten backport
问:如何在android项目中使用threetenabp,有非常透彻的解释。

展开查看全部
mbjcgjjk

mbjcgjjk4#

定义关键日期并删除日期早于关键日期的所有课程。如果您有合适的getter:

  1. ArrayList<Courses> list = new ArrayList<Courses>();
  2. //populate list
  3. Date someDate = new SimpleDateFormat("MM/dd/yyyy").parse("01/01/2020");
  4. list.removeIf(c -> c.getDate().before(someDate));

亲爱的@randy casburn写了一个最小但完整的例子,我不想对感兴趣的读者隐瞒:

  1. /**
  2. *
  3. * @author Randy Casburn
  4. */
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8. public class Main {
  9. public static void main(String[] args) {
  10. Date latest = new Date("1/1/2020");
  11. List<Courses> list = new ArrayList<>();
  12. list.add(new Courses(350, new Date("5/20/2020")));
  13. list.add(new Courses(350, new Date("4/20/2019")));
  14. list.add(new Courses(350, new Date("3/20/2018")));
  15. list.add(new Courses(360, new Date("6/20/2020")));
  16. list.add(new Courses(360, new Date("5/20/2019")));
  17. list.add(new Courses(370, new Date("5/20/2020")));
  18. list.add(new Courses(370, new Date("5/19/2018")));
  19. list.add(new Courses(360, new Date("4/10/2016")));
  20. list.removeIf(course -> !course.date.after(latest));
  21. list.forEach(l-> System.out.println(l.date));
  22. }
  23. }
  24. class Courses {
  25. int coursenum;
  26. Date date;
  27. Courses(int coursenum, Date date){
  28. this.coursenum = coursenum;
  29. this.date = date;
  30. }
  31. }
展开查看全部

相关问题