比较日期列表,然后在选择日期并将其四舍五入为最接近的分钟之前先找到最接近该分钟的日期

问题描述 投票:0回答:2

我有一个对象类型的列表-TrackingMessage,其中包含一个日期。该列表可以包含5-几千个条目。

我需要遍历该列表,比较每个日期以找出最接近分钟的日期。该列表在一分钟内可能包含3或4个条目,因此它需要先找到最接近该分钟的条目,然后再四舍五入到最接近的分钟。

即12:45:22、12:45:35、12:45:15

从上面的小示例中,它会选择12:45:15,因为它最接近分钟,然后将其舍入到最接近的分钟-12:45:00

我当前拥有的代码如下:

根据时间返回排序和四舍五入消息列表的方法

private List<TrackingMessage> findTrackingMessageDatesToNearestMinute(List<TrackingMessage> filteredTrackingMessages) {
    return filteredTrackingMessages.stream()
            .sorted(orderByClosestToMinute)
            .filter(JourneyServiceUtil.distinctByKey(x -> roundToClosestMinute(x)))
            .sorted(comparing(TrackingMessage::getEventTime))
            .collect(Collectors.toList());
  }

传递到流中的比较器

  public Comparator<TrackingMessage> orderByClosestToMinute = (tm1, tm2) -> {
    LocalDateTime roundedTrackingMessage1 = roundToClosestMinute(tm1);
    LocalDateTime roundedTrackingMessage2 = roundToClosestMinute(tm2);
    Duration tm1Duration = Duration.between(DateTimeUtils.toLocalDateTime(tm1.getEventTime()), roundedTrackingMessage1).abs();
    Duration tm2Duration = Duration.between(DateTimeUtils.toLocalDateTime(tm2.getEventTime()), roundedTrackingMessage2).abs();
    return tm1Duration.compareTo(tm2Duration);
  };

将时间四舍五入到分钟的功能

  private LocalDateTime roundToClosestMinute(TrackingMessage trackingMessage) {
    return DateTimeUtils.toLocalDateTime(DateUtils.round(trackingMessage.getEventTime(), Calendar.MINUTE));
  }

删除重复项的功能

  public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
  }

现在,此代码已经可以工作了,但是返回此代码的响应如下:

{
    "status": "success",
    "serviceId": "d8f2092b-01de-424f-9068-32c4efdcfd45",
    "driverId": "e1275ef6-f885-4724-9255-2e03868df5ee",
    "eventList": [
        {
            "eventTime": "2019-07-18T13:09:01",
            "eventId": 15,
            "lat": 50.4130166,
            "lon": -5.0739198
        },
        {
            "eventTime": "2019-07-18T13:10:04",
            "eventId": 21,
            "lat": 50.412991299999995,
            "lon": -5.073924
        },
        {
            "eventTime": "2019-07-18T13:11:04",
            "eventId": 21,
            "lat": 50.413074599999995,
            "lon": -5.074010299999999
        },
        {
            "eventTime": "2019-07-18T13:12:04",
            "eventId": 21,
            "lat": 50.4131295,
            "lon": -5.0739676
        },
        {
            "eventTime": "2019-07-18T13:13:04",
            "eventId": 21,
            "lat": 50.4133475,
            "lon": -5.073917499999999
        },
        {
            "eventTime": "2019-07-18T13:14:04",
            "eventId": 21,
            "lat": 50.4133618,
            "lon": -5.0739218
        },
        {
            "eventTime": "2019-07-18T13:15:04",
            "eventId": 21,
            "lat": 50.4133333,
            "lon": -5.073961
        },
        {
            "eventTime": "2019-07-18T13:16:04",
            "eventId": 21,
            "lat": 50.4132803,
            "lon": -5.0739765
        },
        {
            "eventTime": "2019-07-18T13:17:04",
            "eventId": 21,
            "lat": 50.4133433,
            "lon": -5.0739588
        },
        {
            "eventTime": "2019-07-18T13:18:04",
            "eventId": 21,
            "lat": 50.413306999999996,
            "lon": -5.0739355999999995
        },
        {
            "eventTime": "2019-07-18T13:19:04",
            "eventId": 21,
            "lat": 50.4133013,
            "lon": -5.073953599999999
        },
        {
            "eventTime": "2019-07-18T13:20:04",
            "eventId": 21,
            "lat": 50.413309299999995,
            "lon": -5.073988099999999
        },
        {
            "eventTime": "2019-07-18T13:21:04",
            "eventId": 21,
            "lat": 50.4133146,
            "lon": -5.0739618
        },
        {
            "eventTime": "2019-07-18T13:22:04",
            "eventId": 21,
            "lat": 50.413287999999994,
            "lon": -5.0739141
        },
        {
            "eventTime": "2019-07-18T13:23:04",
            "eventId": 21,
            "lat": 50.4132981,
            "lon": -5.0739008
        },
        {
            "eventTime": "2019-07-18T13:24:04",
            "eventId": 21,
            "lat": 50.413283,
            "lon": -5.07386
        },
        {
            "eventTime": "2019-07-18T13:25:03",
            "eventId": 52,
            "lat": 50.413303,
            "lon": -5.0738673
        },
        {
            "eventTime": "2019-07-18T13:26:01",
            "eventId": 60,
            "lat": 50.4135111,
            "lon": -5.0737745
        },
        {
            "eventTime": "2019-07-18T13:27:02",
            "eventId": 130,
            "lat": 50.415140099999995,
            "lon": -5.073355299999999
        },
        {
            "eventTime": "2019-07-18T13:28:00",
            "eventId": 125,
            "lat": 50.4139743,
            "lon": -5.0697981
        },
        {
            "eventTime": "2019-07-18T13:29:01",
            "eventId": 21,
            "lat": 50.4186421,
            "lon": -5.0698473
        },
        {
            "eventTime": "2019-07-18T13:30:09",
            "eventId": 153,
            "lat": 50.418105999999995,
            "lon": -5.0624391
        },
        {
            "eventTime": "2019-07-18T13:30:50",
            "eventId": 21,
            "lat": 50.4185011,
            "lon": -5.0581641
        },
        {
            "eventTime": "2019-07-18T13:31:59",
            "eventId": 21,
            "lat": 50.417915099999995,
            "lon": -5.0517363
        },
        {
            "eventTime": "2019-07-18T13:33:02",
            "eventId": 131,
            "lat": 50.4194111,
            "lon": -5.0496058
        },
        {
            "eventTime": "2019-07-18T13:35:34",
            "eventId": 51,
            "lat": 50.4194153,
            "lon": -5.049543
        }
    ]
}

您可以看到(朝底部)在13:30 {2019-07-18T13:30:50,2019-07-18T13:30:09}内有两次,

从技术上讲,我想选择2019-07-18T13:30:09,因为它最接近分钟(9秒,另外10秒)]

此外,如果您查看响应中的时间,则以秒为单位,并且不舍入。

如果不清楚,请随时提出任何其他问题。

我有一个对象类型的列表-TrackingMessage,其中包含一个日期。该列表可以包含5-数千个条目。我需要遍历该列表,比较每个日期以找出哪个日期是...

java json datetime functional-programming stream
2个回答
0
投票

我可能是错的,但似乎您想在每小时30分钟内循环以进行比较。所以用伪代码...lastNow =现在(目标睡眠)如果目标是getLastModified <= lastNow +30分钟


0
投票

我认为问题之一可能是这条线:

© www.soinside.com 2019 - 2024. All rights reserved.