Стрим в java. Работа с датой в потоке Java - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно перевести строку sDate и year_of_enrollment в потоке на дату и отсортировать по sDate. Код программы:

`

import java.util.stream.Stream;
import java.text.SimpleDateFormat;  
import java.util.Date;
import java.util.Comparator;

public class Program {
    public static void main(String[] args) throws Exception {
        System.out.println("FIO \t\t\t\tSdate \tyear_of_enrollment \tmath1 \tphisic \toop");
        Stream<Student> StudentStream = 
            Stream.of(new Student("Student1", "2018-12-12", "12.09.2014", 90, 86, 98),
                      new Student("Student2", "2018-12-12", "12.09.2014", 91, 80, 90));

        StudentStream.sorted(new StudentComparator())
                .forEach(p -> System.out.printf("%s | \t%s | \t\t%s | \t\t\t%d \n", 
                            p.getName(), 
                            p.getDate(),
                            p.getYear_of_enrollment(), 
                            p.getMath1(), p.getPhisic(), 
                            p.getOop()));
    }
}

class Student {

    private String name;
    // private String date_of_birth;
    String sDate1;

    private String year_of_enrollment;
    private int math1;
    private int phisic;
    private int oop;

    public Student(String name, String sDate1, 
            String year_of_enrollment, int math1, int phisic, int oop) {
        this.name = name;
        this.sDate1 = sDate1;

        this.year_of_enrollment = year_of_enrollment;
        this.math1 = math1;
        this.phisic = phisic;
        this.oop = oop;
    }

    public int avg(int math1, int phisic, int oop) {
        return (math1 + phisic + oop) / 3;
    }

    public String getName() {
        return name;
    }

    public String getDate() {
        return sDate1;
    }

    public String getYear_of_enrollment() {
        return year_of_enrollment;
    }

    public int getMath1() {
        return math1;
    }

    public int getPhisic() {
        return phisic;
    }

    public int getOop() {
        return oop;
    }
}

class StudentComparator implements Comparator<Student> {
    public int compare(Student x, Student y) {
        return x.getName()
                .toUpperCase()
                .compareTo(y.getName()
                        .toUpperCase());
    }
}

Без потока мне удалось перевести строку в дату

import java.util.Date;  
import java.text.SimpleDateFormat;
public class StringToDateExample1 {
    public static void main(String[] args) throws Exception {
        Student st = new Student();
        st.SetDate("12/12/2019");
        Date date1 = new SimpleDateFormat("dd/MM/yyyy").parse(st.getDate());
        System.out.println(date1);
    }
}

class Student {
    String sDate1;

    public void SetDate(String sDate1) {
        this.sDate1 = sDate1;

    }

    public String getDate() {
        return sDate1;
    }
}

помогите пожалуйста. Я также хотел бы знать, как получить среднее значение всех введенных значений numeri c и распечатать в отдельной строке.

1 Ответ

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

Используйте getTime () для сравнения дат. Поскольку getTime () даст вам (долгое) время в миллисекундах

   public int compare(Student x, Student y) {
        return (int)(stringToDate(x.getDate()).getTime() -  stringToDate(y.getDate()).getTime()) ;
    }

Функция String to Date может быть записана с использованием DateFormat и SimpleDateFormat

    public static Date stringToDate(String sDate){
        Date tmpDate = null;
        DateFormat dateFormatText = new SimpleDateFormat("dd-MM-yyyy");
        try {
            tmpDate = dateFormatText.parse(sDate);
        } catch (ParseException pe) {
            System.out.println(pe);
        }
        return tmpDate;
    }

, я бы посоветовал вам обработать конкретный формат строки для простоты, иначе вы также можете сделать эту функцию generi c.

    public static Date stringToDate(String pattern, String dateStr) {

        Date date = null;

        if (!(dateStr == null || "".equals(dateStr) || pattern == null || "".equals(pattern))) {

            SimpleDateFormat sdf = new SimpleDateFormat(pattern);

            try {
                date = sdf.parse(dateStr);
            } catch (ParseException pe) {
                log.error("Unable to parse date: \'" + dateStr + "\'");
                // log.error("", pe);
                return null;
            } catch (IllegalArgumentException ia) {
                log.error("Unable to parse Pattern: \'" + pattern + "\'");
                // log.error("", ia);
                return null;
            }
        }
        return date;
    }

Используя карту потока, вы можете преобразовать все StringDate в Date

StudentStream.map(e-> StudentComparator.stringToDate(e.getDate()))
             .forEach(System.out::println)

Для печати Среднее:

studentStream.sorted(new StudentComparator())
             .forEach(e-> System.out.println(e.avg(e.getMath1(),e.getPhisic(),e.getOop())));

...