如何遍历对象列表、转换字段、比较它,然后按该字段排序?
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
- 这是错误的,您不需要提供集合作为第一个参数。
我遇到了一个问题,我认为我必须将我正在阅读的几个概念结合起来,但我似乎无法找到一种有意义的方式来组合它们,或者什么是最有效的。这是我的情况:
我正在使用微服务,这就是为什么它如此特殊。本质上,我是从另一个服务获取 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
- 这是错误的,您不需要提供集合作为第一个参数。