Дата сортировка по Java - PullRequest
       7

Дата сортировка по Java

2 голосов
/ 31 марта 2020

Инструкция состояла в том, чтобы создать случайные даты для каждого объекта в диапазоне, указанном в инструкциях ниже для объектов слота интервью, которые будут сохранены. Я не совсем уверен, как это сделать

Создать случайное количество объектов InterviewSlot и сохранить их в контейнере слотов.
Используйте метод Math.random () для создания вариаций в создаваемых объектах:

  • Укажите диапазон изменения дат в часах.
  • Диапазон должен составлять 30 дней, что означает, что даты могут варьироваться между, скажем, сегодня и 30 днями с этого момента. Максимальный диапазон будет равен 30 * 24.
  • . Минимальный диапазон можно установить равным 1.
  • . Длительность варьируется от 1 до 60.

Примеры объектов:

Thu Apr 02 05:28:59 EDT 2020 duration:18
Fri Mar 27 00:22:32 EDT 2020 duration:48
Wed Apr 01 20:22:32 EDT 2020 duration:8
Sat Mar 28 19:22:32 EDT 2020 duration:31

import java.util.Calendar;
import java.util.Date;







public class InterviewSlot implements Comparable<InterviewSlot> {

    Calendar cal = Calendar.getInstance();
    private Date startTime = cal.getTime();
    private Integer duration;

    public InterviewSlot(Date start, Integer d) {
        setDuration(d);
        setStartTime(start);

    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Integer getDuration() {
        return duration;
    }

    public Date getStartTime() {
        return startTime;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "Interview Start " + getStartTime() + "Duration :  " + getDuration();
    }

    @Override

    public int compareTo(InterviewSlot s) {
        return this.getStartTime().compareTo(s.getStartTime());
        // TODO Auto-generated method stub

    }

}


import java.awt.List;
import java.util.ArrayList;

public class DataCreator {

    public static <E extends Comparable<E>> void outputData(ArrayList<E> l) {
        for (E L : l) {
            System.out.println(L);
        }

    }

    public static void createIntegers(ArrayList<Integer> a, int num) {
        // double random = (int)(Math.random()*((100-1)+1))+1;
        for (int i = 0; i < num; i++) {
            Integer random = (int) (Math.random() * ((100 - 1) + 1)) + 1;
            a.add(random);

        }

        ;
    }

    public static void createData(ArrayList<InterviewSlot> slots, int num) {

    }

}

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

Я отвечу так, как будто это для реальной работы, поскольку вы не указали явно школьную работу.

ThreadLocalRandom

Используйте ThreadLocalRandom, чтобы избежать каких-либо возможные проблемы параллелизма. Нет недостатка в использовании этого класса сверх Math.random. И этот класс имеет удобные методы для генерации различных типов чисел, а не просто double.

java .time

Никогда не используйте Calendar или Date. Эти ужасные классы даты и времени были вытеснены годами go современными java .time классами, определенными в JSR 310.

Получите сегодняшнюю дату.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;

Добавьте случайное количество дней в течение следующих 30 дней.

int days = ThreadLocalRandom.current().nextInt( 1 , 31 ) ;
LocalDate localDate = today.plusDays( days ) ;

Дни могут различаться по продолжительности, например 23, 24, 25 или другое количество часов. Поэтому для вашей даты в вашей зоне рассчитайте максимальное количество секунд.

ZonedDateTime start = localDate.atStartOfDay( z ) ;
ZonedDateTime stop = localDate.plusDays( 1 ).atStartOfDay( z ) ;
Duration d = Duration.between( start.toInstant() , stop.toInstant() ) ;
long seconds = d.toSeconds() ;  // In Java 9 and later. For Java 8, call `Duration::getSeconds`.

Это количество секунд становится максимальным для нашей продолжительности дня. Из этого мы выбираем случайное количество секунд.

long secondsIntoDay = ThreadLocalRandom.current().nextInt( 0 , seconds ) ;
ZonedDateTime zdt = start.plusSeconds( secondsIntoDay ) ;

Определите случайную продолжительность от 1 до 60 минут для истекшего времени каждого события.

int minutes = ThreadLocalRandom.current().nextInt( 1 , 61 ) ; // At least one minute, and less than 61 minutes.
Duration duration = Duration.ofMinutes( minutes ) ;

Определите ваш public class InterviewSlot с двумя полями-членами: a ZonedDateTime и Duration.

1 голос
/ 31 марта 2020

Согласно предложению @Basil Bourque, следующий код должен помочь:

import java.time.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

public static void main(String[] args) {
    int numberOfRandomDates = 10;
    ArrayList<InterviewSlot>  interviewSlotArrayList= new ArrayList<>();
    for (int i = 0; i< numberOfRandomDates ; i++) {
        InterviewSlot interviewSlot = calculateInterviewSlot();
        interviewSlotArrayList.add(interviewSlot);
        System.out.println(interviewSlot);
    }

    Collections.sort(interviewSlotArrayList);
    System.out.println("After sorting: \n");

    //Using lamda
    interviewSlotArrayList.forEach(element -> {
        System.out.println(element);
    });

    //or Using method reference
    interviewSlotArrayList.forEach(System.out::println);
  }

    public static InterviewSlot calculateInterviewSlot() {
        //Getting time zone id and setting local time according to the time zone
        ZoneId z = ZoneId.of("America/Montreal");
        LocalDate today = LocalDate.now(z);

        //Getting a random day between 1 and 31 and adding it to the current date
        int days = ThreadLocalRandom.current().nextInt(1, 31);
        LocalDate localDate = today.plusDays(days);

        //Getting start and end time of the day as per time zone.End time is taken as next day start time(24 hr)
        ZonedDateTime start = localDate.atStartOfDay(z);
        ZonedDateTime stop = localDate.plusDays(1).atStartOfDay(z);

        //Duration is taken which is the max duration for that time zone.
        Duration duration = Duration.between(start.toInstant(), stop.toInstant());
        long seconds = TimeUnit.SECONDS.convert(duration.toNanos(), TimeUnit.NANOSECONDS);

        //Calculating random no of seconds keeping the computed seconds as max seconds in the day
        long secondsIntoDay = ThreadLocalRandom.current().nextInt(0, Math.toIntExact(seconds));
        ZonedDateTime zonedDateTime = start.plusSeconds(secondsIntoDay);

        //Calculating random no of minutes for duration
        int minutes = ThreadLocalRandom.current().nextInt(1, 61);
        Duration durationMinutes = Duration.ofMinutes(minutes);

        return new InterviewSlot(zonedDateTime, durationMinutes);
    }
}

InterviewSlot. java:

public class InterviewSlot implements Comparable<InterviewSlot> {

    private ZonedDateTime startTime;
    private Duration duration;

    public InterviewSlot() {
    }

    public InterviewSlot(ZonedDateTime startTime, Duration duration) {
        this.startTime = startTime;
        this.duration = duration;
    }

    public ZonedDateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(ZonedDateTime startTime) {
        this.startTime = startTime;
    }

    public Duration getDuration() {
        return duration;
    }

    public void setDuration(Duration duration) {
        this.duration = duration;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "Interview Start " + getStartTime() + " Duration :  " + getDuration();
    }

    @Override

    public int compareTo(InterviewSlot s) {
        return this.getStartTime().compareTo(s.getStartTime());
        // TODO Auto-generated method stub

    }

}

Сгенерированный пример вывода :

Interview Start 2020-04-24T02:16:09-04:00[America/Montreal] Duration :  PT12M
Interview Start 2020-04-04T20:58:43-04:00[America/Montreal] Duration :  PT38M
Interview Start 2020-04-25T00:09:12-04:00[America/Montreal] Duration :  PT31M
Interview Start 2020-04-03T20:26:01-04:00[America/Montreal] Duration :  PT22M
Interview Start 2020-04-06T03:48:29-04:00[America/Montreal] Duration :  PT45M
Interview Start 2020-04-15T07:56:32-04:00[America/Montreal] Duration :  PT34M
Interview Start 2020-04-21T09:25:15-04:00[America/Montreal] Duration :  PT44M
Interview Start 2020-04-30T18:33:40-04:00[America/Montreal] Duration :  PT52M
Interview Start 2020-04-16T07:12:54-04:00[America/Montreal] Duration :  PT14M
Interview Start 2020-04-24T17:02:48-04:00[America/Montreal] Duration :  PT50M
1 голос
/ 31 марта 2020

Простое решение с датой для вашего специального случая c, включая пример:

import java .util.Date; import java .util.Random;

import org. apache .commons.lang3.time.DateUtils;

public class SimpleDateGenerator {
    private static Random random = new Random();

    public static Date getRandomDate(Date start, long timerangeSeconds) {
        int randomTime = (int) Math.ceil(random.nextDouble() * timerangeSeconds);
        return DateUtils.addSeconds((Date) start.clone(), randomTime);
    }

    public static void main(String[] args) {
        Date now = new Date();
        System.out.println(now);
        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomDate(now, 30 * 24 * 60 * 60));
        }

    }

}

main дает следующий (пример) вывод:

Tue Mar 31 08:26:14 CEST 2020
Sun Apr 19 16:06:48 CEST 2020
Fri Apr 03 20:49:58 CEST 2020
Wed Apr 22 22:27:00 CEST 2020
Mon Apr 06 03:39:48 CEST 2020
Wed Apr 22 19:13:28 CEST 2020
Fri Apr 03 12:36:16 CEST 2020
Wed Apr 22 20:27:35 CEST 2020
Mon Apr 06 13:58:37 CEST 2020
Fri Apr 03 03:57:17 CEST 2020
Wed Apr 15 09:05:47 CEST 2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...