如何遍历对象列表、转换字段、比较它,然后按该字段排序?

How to iterate through a list of objects, convert a field, compare it, then sort by that field?

我遇到了一个问题,我认为我必须将我正在阅读的几个概念结合起来,但我似乎无法找到一种有意义的方式来组合它们,或者什么是最有效的。这是我的情况:

我正在使用微服务,这就是为什么它如此特殊。本质上,我是从另一个服务获取 Volume 对象的列表。一个volume对象包含三个字段,一个String类型,一个String date(实际上表示格式为"HH:mm"的时间,怪数据建模师的命名约定)和一个int close.

我想要做的是获取这个对象列表并按日期(时间)排序,然后创建一个新的对象列表,其中将包含相同的日期(时间),但将具有不同的字段值关闭我正在做的计算。为了按时间排序,我相信我需要将时间字段转换为 Date 对象,然后进行比较。我正在努力如何遍历对象并比较转换后的字段。我觉得让我走上正确道路的是:How to sort a List<Object> alphabetically using Object name field

但我似乎无法让它发挥作用。这是我的代码:

volumeResources.sort(volumeResources, new Comparator<VolumeResource>(){
        @Override
        public int compare(VolumeResource v1, VolumeResource v2) {
            SimpleDateFormat format = new SimpleDateFormat("HH:mm");
            try {
                Date d1 = format.parse(v1.getDate());
                Date d2 = format.parse(v2.getDate());
            } catch (ParseException e) {
                log.error("Error in parsing string to date. ", e);
            }
            return d1.compareTo(d2);
        }
    });

马上,我知道这一定是不正确的,因为我开始比较 VolumeResources v1 和 v2,但最后尝试比较日期。代替上面的 return 语句,我还尝试了下面的语句,但我认为这不会总是有效,因为它实际上并没有将格式化对象设置为 Date 对象:

return format.parse(v1.getDate()).compareTo(format.parse(v2.getDate()));

这就是我迷路的地方。当用伪代码描述时,这似乎是一个相当简单的需求,但我似乎无法弄清楚如何使其正常工作。如果有一种方法可以从中轻松填充我需要的其他字段,那么奖励积分。使用 lambda 或帮助我提高效率的双倍奖励积分。

感谢大家的帮助。

Java 中的日期必须有年、月、日。 但是你没有这样的值,你只有 HH:mm (小时,分钟)。 在这里使用日期是不合适的。 (而且叫这些值"date"也很奇怪,我建议重命名。)

请注意,格式正确的 HH:mm 可以按字母顺序排序以正确排序。因此,您需要做的就是确保输入时间遵循 \d\d:\d\d 模式。例如,如果得到 9:15,则在左侧添加填充 0。像这样:

volumeResources.sort(volumeResources, new Comparator<VolumeResource>() {
    @Override
    public int compare(VolumeResource v1, VolumeResource v2) {
        return sanitized(v1.getDate()).compareTo(sanitized(v2.getDate());
    }
});

sanitized方法供您相应实施。 如果值的格式已经正确,类型为 String,那么您可以放弃这些调用并简化为:

        return v1.getDate().compareTo(v2.getDate();

使用 lambda:

volumeResources.sort(volumeResources, (v1, v2) -> sanitized(v1.getDate()).compareTo(sanitized(v2.getDate()));

如果您使用的是 Java 8 及更高版本,按时间排序(表示为字符串)可能如下所示:

    volumeResources.sort(new Comparator<VolumeResource>() {
        @Override
        public int compare(VolumeResource v1, VolumeResource v2) {
            return v1.getDate().compareTo(v2.getDate());
        }
    });

之前的 Java 8 它应该是这样的:

    Collections.sort(volumeResources, new Comparator<VolumeResource>() {
        @Override
        public int compare(VolumeResource v1, VolumeResource v2) {
            return v1.getDate().compareTo(v2.getDate());
        }
    });

使用 lambda:

    volumeResources.sort((v1, v2) -> v1.getDate().compareTo(v2.getDate()));

假设 volumeResources 是一个已填充的可变 List(不是 null)并且所有条目的日期字段都正确填充了格式正确的时间(没有空格、制表符或缺失前导 0)

说明

根据你定义的date字段,自然可以排序为字符串,不需要转成java Date class.

您的示例使用 Java 8 sort 接口中定义的 List 方法时出现问题class Collections - 这是错误的,您不需要提供集合作为第一个参数。