gpt4 book ai didi

java - Java中 block 的排序日期列表

转载 作者:行者123 更新时间:2023-12-05 08:47:16 24 4
gpt4 key购买 nike

我有一个排序的 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: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

最佳答案

根据您是要存储结果还是打印结果,您可以使用多个选项。在此之前,需要考虑以下几点:

  • 在提供的答案中,.collect(Collectors.toList())可以替换为 .forEach(System.out::println)如果您只想打印它们。还必须删除对列表结果的分配。
  • List.subList在这里派上用场。但是每个 subList只是原始列表的一个 View 。所以对 subList 的任何更改会改变原来的。这可以通过传递 subList 来解决。作为 ArrayList<>() 的参数
  • 显示的结果基于 OffsetDateTime 的默认 toString 显示.要更改它,您可以申请 DateTimeFormatter在流结构中。

只需使用 stream 成对打印值和一个 subList

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();

关于java - Java中 block 的排序日期列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68085776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com