【问题标题】:Date Sorting in JavaJava中的日期排序
【发布时间】:2020-03-31 05:36:12
【问题描述】:

指令是为每个对象创建一个随机日期,其范围在以下说明中指定的范围内,以便将采访槽对象存储在 中。我不完全确定如何做到这一点

创建随机数量的 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) {

    }

}

【问题讨论】:

  • 那么你的问题是什么?
  • 我强烈建议您使用java.time,它是用于处理日期和时间的 Java API。它比 DateCalendar 等旧类更健壮、更好用。
  • @ScaryWombat 如何使用随机生成器为我的日期生成 1 到 30 天之间的值,如说明中所暗示的那样

标签: java sorting collections


【解决方案1】:

我会回答,好像这是为了真正的工作,因为你没有明确指出功课。

ThreadLocalRandom

使用ThreadLocalRandom 来避免任何可能的并发问题。在Math.random 上使用此类没有任何缺点。而且这个类有方便的方法来生成各种类型的数字,而不仅仅是double

java.time

切勿使用CalendarDate。那些可怕的日期时间类在几年前被 JSR 310 中定义的现代 java.time 类所取代。

获取今天的日期。

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 InterviewSlotZonedDateTimeDuration

【讨论】:

  • 优秀的代码,我在试用您的代码时发现的唯一问题是,在 Duration 类中,toSeconds() 方法是私有的。我必须在获得纳秒后转换它。
  • @Ananthapadmanabhan Duration::toSeconds 的 Javadoc 表示 public。但是该方法是在 Java 9 中添加的。如果特别是在 Java 8 中,请调用 getter,Duration::getSeconds。该方法是一个 getter,因为在内部 Duration 存储了一对 64 位长整数。一个数字是整秒的计数,另一个是纳秒的计数,作为秒的分数。我在答案中的代码行中添加了注释。感谢您提出问题。
【解决方案2】:

针对特定情况的简单解决方案,包括一个示例:

导入 java.util.Date; 导入 java.util.Random;

导入 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

【讨论】:

    【解决方案3】:

    根据@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2019-12-14
      相关资源
      最近更新 更多