Java中块的排序日期列表



我有一个排序的OffsetDateTime日期列表:

[2021-05-21T11:00-04:00, 2021-05-21T12:00-04:00, 2021-05-21T13:00-04:00, 2021-05-21T14:00-04:00, 2021-05-21T15:00-04:00, 2021-05-21T15:30-04:00, 2021-05-21T15:45-04:00, 2021-05-21T17:00-04:00]

我想创建一个对象列表,其开始和结束日期如下:

{开始时间:2021-05-21T11:00-04:00,结束时间:2021:05-21T12:00-04:00}

{开始时间:2021-05-21T12:00-04:00,结束时间:2021:05-21T13:00-04:00}

{开始时间:2021-05-21T13:00-04:00,结束时间:2021:05-21T14:00-04:00}

{开始时间:2021-05-21T14:00-04:00,结束时间:2021:05-21T15:00-04:00}

{开始时间:2021-05-21T15:00-04:00,结束时间:2021:05-21T15:30-04:00}

{开始时间:2021-05-21T15:30-04:00,结束时间:2021:05-21T15:45-04:00}

{开始时间:2021-05-21T15:45-04:00,结束时间:2021:05-21T17:00-04:00}

请注意,下一个日期的开始是上一个日期(除了第一个和最后一个(的结束

到目前为止我所拥有的。。。

// Create List<AppointmentAvailabilityBlock>
List<AppointmentAvailabilityBlock> appointmentAvailabilityBlockList = new ArrayList<>();
for (int i = 0; i < sortedTimes.size(); i+=2) {

OffsetDateTime start = sortedTimes.get(i);
OffsetDateTime end = sortedTimes.get(i+1);
appointmentAvailabilityBlockList.add(new AppointmentAvailabilityBlock(start, end));

}

但是这个输出:

2021-05-21T11-000-04:00 2021-05-21 12:00-04:00

2021-05-21T13:00-04:00

2021-05-21T15:00-04:00 2021-05-21 15:30-04:00

2021-05-21T15:45-04:00 2021-05-21 17:00-04:00

根据是要存储结果还是打印结果,可以使用几个选项。在此之前,这里有一些需要考虑的要点:

  • 在提供的答案中,如果您只想打印.collect(Collectors.toList()),则可以将其替换为.forEach(System.out::println)。还必须删除对列表结果的分配
  • List.subList在这里派上了用场。但每个subList只是原始列表中的一个视图。因此,对subList的任何更改都将更改原始内容。这可以通过将subList作为参数传递给ArrayList<>()来解决
  • 所显示的结果基于CCD_ 8的默认toString显示。要更改这一点,可以在流构造中应用DateTimeFormatter

只需使用streamsubList成对打印值

IntStream.range(1, sortedTimes.size())
.mapToObj(i -> sortedTimes.subList(i - 1, i + 1))
.forEach(System.out::println);

打印

[2021-05-21T11:00-04:00, 2021-05-21T12:00-04:00]
[2021-05-21T12:00-04:00, 2021-05-21T13:00-04:00]
[2021-05-21T13:00-04:00, 2021-05-21T14:00-04:00]
[2021-05-21T14:00-04:00, 2021-05-21T15:00-04:00]
[2021-05-21T15:00-04:00, 2021-05-21T15:30-04:00]
[2021-05-21T15:30-04:00, 2021-05-21T15:45-04:00]
[2021-05-21T15:45-04:00, 2021-05-21T17:00-04:00]

将这些对存储在稍后要处理的列表列表中。如上所述,subList被传递到ArrayList

List<List<OffsetDateTime>> list = IntStream
.range(1, sortedTimes.size())
.mapToObj(i -> new ArrayList<>(sortedTimes.subList(i - 1, i + 1)))
.collect(Collectors.toList());

在列表中进行更精细的打印和存储。

List<String> listString = IntStream.range(1, sortedTimes.size())
.mapToObj(i -> sortedTimes.subList(i - 1, i + 1))
.map(s->"Start: " + s.get(0) + " - End: " + s.get(1))
.collect(Collectors.toList());
list.forEach(System.out.println);

打印

Start: 2021-05-21T11:00-04:00 - End: 2021-05-21T12:00-04:00
Start: 2021-05-21T12:00-04:00 - End: 2021-05-21T13:00-04:00
Start: 2021-05-21T13:00-04:00 - End: 2021-05-21T14:00-04:00
Start: 2021-05-21T14:00-04:00 - End: 2021-05-21T15:00-04:00
Start: 2021-05-21T15:00-04:00 - End: 2021-05-21T15:30-04:00
Start: 2021-05-21T15:30-04:00 - End: 2021-05-21T15:45-04:00
Start: 2021-05-21T15:45-04:00 - End: 2021-05-21T17:00-04:00

以下是List<OffsetDateTime>是如何创建的

List<String> sortedStringTimes = new ArrayList<>(List.of("2021-05-21T11:00-04:00",
"2021-05-21T12:00-04:00", "2021-05-21T13:00-04:00",
"2021-05-21T14:00-04:00", "2021-05-21T15:00-04:00",
"2021-05-21T15:30-04:00", "2021-05-21T15:45-04:00",
"2021-05-21T17:00-04:00"));
DateTimeFormatter df = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
// toList() as used below was introduced in Java 16
List<OffsetDateTime> sortedTimes = sortedStringTimes.stream()
.map(odt->OffsetDateTime.from(df.parse(odt))).toList();

public void createObjects(List<OffsetDateTime> dates){
for(int i=0;i<dates.size()-1;i++){
Pair<OffsetDateTime, OffsetDateTime> date = new Pair<>(dates.get(i), dates.get(i+1));
// handle each object as you require
call_my_function(date);
}
}

如果您想通过流使用更现代的方法。你可以在那里找到更好的解决方案。

简而言之,您的代码可能看起来像下一个:

IntStream.range(1, sortedTimes.size())
.mapToObj(i -> new AppointmentAvailabilityBlock(sortedTimes.get(i-1), sortedTimes.get(i)))
.forEach(System.out::println)

相关内容

  • 没有找到相关文章

最新更新