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

xjreopfe  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(354)

这是我的数组列表

ArrayList<Courses> list = new ArrayList<Courses>();
list.add( new Courses(350,5/20/2020) );
list.add( new Courses(350,4/20/2019 );
list.add( new Courses(350,3/20/2018) );
list.add( new Courses(360,6/20/2020) );
list.add( new Courses(360,5/20/2019) );
list.add( new Courses(370,5/20/2020) );
list.add( new Courses(370,5/19/2018) );
list.add( new Courses(360,4/10/2016) );

public class Courses{
 int coursenum;
 Date date;

}

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

350, 5/20/2020}
360,6/20/2020}
370, 5/20/2020
c6ubokkw

c6ubokkw1#

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

public class Courses {

    int courseNum;

    LocalDate date;

    public Courses(int courseNum, LocalDate date) {
        this.courseNum = courseNum;
        this.date = date;
    }

    public int getCourseNum() {
        return courseNum;
    }

    public void setCourseNum(int courseNum) {
        this.courseNum = courseNum;
    }

    public LocalDate getDate() {
        return date;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

    @Override public String toString() {
        return new StringJoiner(", ", Courses.class.getSimpleName() + "[", "]")
                .add("courseNum=" + courseNum)
                .add("date=" + date)
                .toString();
    }

public class Main {
  public static void main(String[] args) {
        List<Courses> list = new ArrayList<>();
        list.add(new Courses(350, LocalDate.of(2020, 5, 20)));
        list.add(new Courses(350, LocalDate.of(2019, 4, 20)));
        list.add(new Courses(350, LocalDate.of(2018, 3, 20)));
        list.add(new Courses(360, LocalDate.of(2020, 6, 20)));
        list.add(new Courses(360, LocalDate.of(2019, 5, 20)));
        list.add(new Courses(370, LocalDate.of(2020, 5, 20)));
        list.add(new Courses(370, LocalDate.of(2018, 5, 19)));
        list.add(new Courses(360, LocalDate.of(2016, 4, 10)));

        List<Courses> res = list.stream().filter(c -> c.getDate().getYear() == 2020).collect(Collectors.toList());

        res.forEach(System.out::println);
    }
bgibtngc

bgibtngc2#

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

public class Courses{
    int coursenum;
    LocalDate date;

  }

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

4dbbbstv

4dbbbstv3#

Java1.7和java.time通过threeten backport

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\u67上运行。我已经添加了310个backport 1.3.6。请参见下面的链接。
这是你的名字 Course i类使用:

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 相反。

流版本

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

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

从代码的立场来看,它在结果列表中没有给出相同的课程顺序,它需要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,有非常透彻的解释。

wnrlj8wa

wnrlj8wa4#

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

ArrayList<Courses> list = new ArrayList<Courses>();
//populate list

Date someDate = new SimpleDateFormat("MM/dd/yyyy").parse("01/01/2020");

list.removeIf(c -> c.getDate().before(someDate));

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

/**
 *
 * @author Randy Casburn
 */
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        Date latest = new Date("1/1/2020");
        List<Courses> list = new ArrayList<>();
        list.add(new Courses(350, new Date("5/20/2020")));
        list.add(new Courses(350, new Date("4/20/2019")));
        list.add(new Courses(350, new Date("3/20/2018")));
        list.add(new Courses(360, new Date("6/20/2020")));
        list.add(new Courses(360, new Date("5/20/2019")));
        list.add(new Courses(370, new Date("5/20/2020")));
        list.add(new Courses(370, new Date("5/19/2018")));
        list.add(new Courses(360, new Date("4/10/2016")));

        list.removeIf(course -> !course.date.after(latest));
        list.forEach(l-> System.out.println(l.date));
    }
}

class Courses {
    int coursenum;
    Date date;
    Courses(int coursenum, Date date){
        this.coursenum = coursenum;
        this.date = date;
    }

}

相关问题