-2

我有一个代码块,它返回一个值列表,但需要按特定值分组

List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(e -> DateUtils.toLocalDateTimeFromUtcLocalDateTime(e.getObservedDtUtc()))
                .map(e -> e.toLocalDate())
                .distinct()
                .map(e -> Date.from(e.atStartOfDay(ZoneId.systemDefault()).toInstant()))
                .map(
                    e ->
                        String.valueOf(e.getTime())
                            .concat("--")
                            .concat(Observation.FIXED_CAMERA_CATEGORY))
                .collect(Collectors.toList());
        all.addAll(fixedCat);

它返回 repose 为

[
    "1603692000000--FIXED",
    "1603778400000--FIXED"
] 

所以我更改了上面的代码以根据区域编号获取所有观察结果

 List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(
                    observation -> {
                      observation.getZoneNumber();
                      LocalDateTime localDateTime =
                          DateUtils.toLocalDateTimeFromUtcLocalDateTime(
                              observation.getObservedDtUtc());
                      LocalDate date = localDateTime.toLocalDate();
                      Date dateTime =
                          Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());

                      return String.valueOf(dateTime.getTime())
                          .concat("--")
                          .concat(Observation.FIXED_CAMERA_CATEGORY)
                          .concat("--")
                          .concat(observation.getZoneNumber());
                    })
                .collect(Collectors.toList());

当我运行闲置代码时,我必须对每个单独的观察结果进行分组

[
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7000",
    "1603692000000--FIXED--7020",
    "1603778400000--FIXED--7020",
    "1603778400000--FIXED--7010",
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7010"
] 

预期反应

[
"1603692000000--FIXED--7010",
"1603778400000--FIXED--7020"

]

4

1 回答 1

0

Collectors.groupingBy就是你要找的。我们按它们的第一个值分组,即日期。然后我们得到组的第一个元素。然后我们将它们收集为列表。你需要像这样实现:

 List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(
                    observation -> {
                      observation.getZoneNumber();
                      LocalDateTime localDateTime =
                          DateUtils.toLocalDateTimeFromUtcLocalDateTime(
                              observation.getObservedDtUtc());
                      LocalDate date = localDateTime.toLocalDate();
                      Date dateTime =
                          Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());

                      return String.valueOf(dateTime.getTime())
                          .concat("--")
                          .concat(Observation.FIXED_CAMERA_CATEGORY)
                          .concat("--")
                          .concat(observation.getZoneNumber());
                    })
                .collect(Collectors.groupingBy(s -> s.split("--")[2])) // group them by their zone number
                .values()
                .stream()
                .map(strings -> strings.get(0))
                .collect(Collectors.toList());

我刚刚在我的本地机器上测试了这个,它似乎给出了你正在寻找的结果:

package com.company;
import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String[] list = {
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7000",
            "1603692000000--FIXED--7020",
            "1603778400000--FIXED--7020",
            "1603778400000--FIXED--7010",
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7010"
        };

        var result = Arrays.stream(list)
                .collect(Collectors.groupingBy(s -> s.split("--")[2])) // group them by their zone number
                .values()
                .stream()
                .map(strings -> strings.get(0))
                .collect(Collectors.toList());

        for (String s : result) {
            System.out.println(s);
        }
    }
}

// prints
// 1603778400000--FIXED--7020
// 1603692000000--FIXED--7010
于 2020-10-27T21:22:22.843 回答