Печать деталей между двумя указанными c датами с использованием LocalDate - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь вернуть данные между двумя датами, указанными в списке массивов, с помощью LocalDate. Мой код:

import java.time.LocalDate;

public class School {    
     private String name;
     private String classID;
     private int pupilID;
     private LocalDate joinDate;

     public School(String name, String classID, int studentID, LocalDate joinDate)
     {  
        this.name = name; 
        this.classID = classID;
        this.pupilID = pupilID;
        this.enrolDate = joinDate;
     }

Тестовый класс

School myPupil = new School();

myPupil.addPupil(new Pupil("John","301B", "8588", LocalDate.parse("2017-03-11")));
myPupil.addPupil(new Pupil("William","401B", "8589", LocalDate.parse("2018-05-12")));
myPupil.addPupil(new Pupil("Jessica","501B", "8590", LocalDate.parse("2019-07-12")));
myPupil.addPupil(new Pupil("Linda","601B", "8591", LocalDate.parse("2020-01-10")));

Изменить:

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainSchool{

    private ArrayList<School> pupilList;

    public MainSchool()
    {
        pupilList = new pupilList<School>();
    }   

    public void addPupil(School newPupil)       
    {
        pupilList.addPupil(newPupil);       
    }
}

Я хочу вернуть всех учеников, которые присоединились к школе в период с 2017 г. С 03.11 по 12.07.2019. Что бы вы посоветовали для этого? Можно ли это сделать с помощью LocalDate?

Ответы [ 4 ]

2 голосов
/ 07 мая 2020

Вы можете использовать LocalDate :: isAfter и LocalDate :: isBefore , чтобы проверить, попадает ли LocalDate между двумя датами.

Демо

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

class Pupil {
    private String studID;
    private String subjectID;
    private String regiNumber;
    private LocalDate dateEnroled;

    public Pupil(String studID, String subjectID, String regiNumber, LocalDate dateEnroled) {
        this.studID = studID;
        this.subjectID = subjectID;
        this.regiNumber = regiNumber;
        this.dateEnroled = dateEnroled;
    }

    public LocalDate getDateEnroled() {
        return dateEnroled;
    }

    @Override
    public String toString() {
        return "Pupil [studID=" + studID + ", subjectID=" + subjectID + ", regiNumber=" + regiNumber + ", dateEnroled="
                + dateEnroled + "]";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Pupil> pupilList = new ArrayList<Pupil>();
        pupilList.add(new Pupil("John", "301B", "8588", LocalDate.parse("2017-03-11")));
        pupilList.add(new Pupil("William", "401B", "8589", LocalDate.parse("2018-05-12")));
        pupilList.add(new Pupil("Jessica", "501B", "8590", LocalDate.parse("2019-07-12")));
        pupilList.add(new Pupil("Linda", "601B", "8591", LocalDate.parse("2020-01-10")));

        List<Pupil> list = new ArrayList<Pupil>();
        LocalDate startDate = LocalDate.parse("2017-03-11");
        LocalDate endDate = LocalDate.parse("2019-07-12");
        for (Pupil pupil : pupilList) {
            if (pupil.getDateEnroled().isAfter(startDate) && pupil.getDateEnroled().isBefore(endDate)) {
                list.add(pupil);
            }
        }

        // Display the list
        for (Pupil pupil : list) {
            System.out.println(pupil);
        }
    }
}

Вывод:

Pupil [studID=William, subjectID=401B, regiNumber=8589, dateEnroled=2018-05-12]

Если вы хотите включить обе даты (startDate и endDate), это можно сделать следующим образом:

List<Pupil> list = new ArrayList<Pupil>();
LocalDate startDate = LocalDate.parse("2017-03-11").minusDays(1);
LocalDate endDate = LocalDate.parse("2019-07-12").plusDays(1);
for (Pupil pupil : pupilList) {
    if (pupil.getDateEnroled().isAfter(startDate) && pupil.getDateEnroled().isBefore(endDate)) {
        list.add(pupil);
    }
}

// Display the list
for (Pupil pupil : list) {
    System.out.println(pupil);
}

Вывод:

Pupil [studID=John, subjectID=301B, regiNumber=8588, dateEnroled=2017-03-11]
Pupil [studID=William, subjectID=401B, regiNumber=8589, dateEnroled=2018-05-12]
Pupil [studID=Jessica, subjectID=501B, regiNumber=8590, dateEnroled=2019-07-12]
1 голос
/ 07 мая 2020

LocalDateRange::contains

Другие ответы здесь верны.

Кроме того, если вы хотите добавить в свой проект библиотеку ThreeTen-Extra , я могу предложить использовать LocalDateRange class.

Этот класс представляет промежуток времени как пару LocalDate объектов. Класс предлагает отличные методы для сравнения, такие как contains, abuts, overlaps и т. Д.

Определите целевой промежуток времени.

LocalDate start = LocalDate.parse( "2017-03-11" ) ;
LocalDate end = LocalDate.parse( "2019-07-12" ) ; 
LocalDateRange range = LocalDateRange.of( start , end ) ;

L oop ваши бизнес-объекты, запрашивая каждый объект Pupil:

boolean inRange = range.contains( pupil.dateEnroled ) ;
0 голосов
/ 07 мая 2020

Сначала класс School.

import java.time.LocalDate;

public class School {
    private String name;
    private String classID;
    private int pupilID;
    private LocalDate joinDate;

    public School(String name, String classID, int studentID, LocalDate joinDate) {  
        this.name = name; 
        this.classID = classID;
        pupilID = studentID;
        this.joinDate = joinDate;
    }

    public LocalDate getJoinDate() {
        return joinDate;
    }

    public String toString() {
        return name;
    }
}

Затем, класс MainSchool.

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class MainSchool {
    /** The list of pupils at the school. */
    private final List<School> pupilList;

    /**
     * Constructor.
     */
    public MainSchool() {
        pupilList = new ArrayList<School>();
    }

    /**
     * Adds newPupil to this school.
     */
    public void addPupil(School newPupil) {
        if (newPupil != null) {
            pupilList.add(newPupil);
        }
    }

    /**
     * Returns a list of students who joined the school between start and end.
     */
    public List<School> getEnrollmentsBetween(LocalDate start, LocalDate end) {
        Objects.requireNonNull(start, "'start' is null");
        Objects.requireNonNull(end, "'end' is null");
        List<School> enrollments;
        if (start.isAfter(end)) {
            enrollments = new ArrayList<School>();
        }
        else {
            enrollments = pupilList.stream()
                                   .filter(pupil -> start.isBefore(pupil.getJoinDate())  &&  end.isAfter(pupil.getJoinDate()))
                                   .collect(Collectors.toList());
        }
        return enrollments;
    }

    /**
     * For testing this class.
     */
    public static void main(String[] args) {
        MainSchool myPupil = new MainSchool();
        myPupil.addPupil(new School("John",   "301B", 8588, LocalDate.parse("2017-03-11")));
        myPupil.addPupil(new School("William","401B", 8589, LocalDate.parse("2018-05-12")));
        myPupil.addPupil(new School("Jessica","501B", 8590, LocalDate.parse("2019-07-12")));
        myPupil.addPupil(new School("Linda",  "601B", 8591, LocalDate.parse("2020-01-10")));
        List<School> enrollments = myPupil.getJoinedBetween(LocalDate.parse("2017-03-11"),
                                                                 LocalDate.parse("2019-07-12"));
        System.out.println(enrollments);
    }
}

Метод getEnrollmentsBetween() использует java s stream API , представленный в Java 8.

0 голосов
/ 07 мая 2020

Вы можете использовать методы isAfter(), isBefore() из класса LocalDate.

EDIT:

for (Pupil p : pupilList) {
    if (p.enrolDate().isAfter(startDate) && p.enrolDate().isBefore(endDate)) {
        list.add(p);
    }
}

Если вы хотите учитывать startDate в качестве допустимой даты для регистрации просто измените условие на это:

if (p.enrolDate().equal(startDate) || (p.enrolDate().isAfter(startDate) && p.enrolDate().isBefore(endDate)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...