Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何遍历对象列表,转换字段,比较它,然后按该字段排序?_Java_List_Sorting_Compare_Listiterator - Fatal编程技术网

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

Java 如何遍历对象列表,转换字段,比较它,然后按该字段排序?,java,list,sorting,compare,listiterator,Java,List,Sorting,Compare,Listiterator,我有一个问题,我认为我必须将我正在阅读的几个概念结合起来,但我似乎无法找到一种方法来将它们结合起来,这样才有意义,或者什么才是最有效的。以下是我的情况: 我与微服务公司合作,这就是为什么这是如此特别的原因。本质上,我是从另一个服务获取卷对象的列表。volume对象包含三个字段,一个字符串类型、一个字符串日期(实际上以“HH:mm”格式表示时间)、一个int close和一个数据建模者的命名约定 我试图做的是获取这个对象列表并按日期(时间)排序,然后创建一个新的对象列表,该列表将包含相同的日期(时

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

我与微服务公司合作,这就是为什么这是如此特别的原因。本质上,我是从另一个服务获取卷对象的列表。volume对象包含三个字段,一个字符串类型、一个字符串日期(实际上以“HH:mm”格式表示时间)、一个int close和一个数据建模者的命名约定

我试图做的是获取这个对象列表并按日期(时间)排序,然后创建一个新的对象列表,该列表将包含相同的日期(时间),但根据我正在进行的计算将具有不同的字段值。为了按时间排序,我认为我需要将时间字段转换为日期对象,然后比较它们。我正在努力迭代对象并比较转换后的字段。我觉得让我走上正确道路的是:

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

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);
        }
    });
那就是我迷路的地方。当用伪代码描述时,这似乎是一个相当简单的需求,但我似乎不知道如何使它在功能上工作。如果有一种方法可以轻松填充我需要的其他字段,则可获得额外积分。使用lambdas或帮助我提高效率可获得双倍积分


谢谢大家的帮助。

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

请注意,格式良好的
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());
    }
});
    volumeResources.sort(new Comparator<VolumeResource>() {
        @Override
        public int compare(VolumeResource v1, VolumeResource v2) {
            return v1.getDate().compareTo(v2.getDate());
        }
    });
使用lambda:

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

如果使用Java 8及以上版本,则按时间排序(以字符串表示)可能如下所示:

volumeResources.sort(volumeResources, new Comparator<VolumeResource>() {
    @Override
    public int compare(VolumeResource v1, VolumeResource v2) {
        return sanitized(v1.getDate()).compareTo(sanitized(v2.getDate());
    }
});
    volumeResources.sort(new Comparator<VolumeResource>() {
        @Override
        public int compare(VolumeResource v1, VolumeResource v2) {
            return v1.getDate().compareTo(v2.getDate());
        }
    });
假设
volumeResources
是一个可填充的可变
列表(非
null
),并且所有条目的日期字段都正确填充了格式良好的时间(没有空格、制表符或缺少前导0)

解释

根据您对日期字段的定义,它自然可以作为字符串排序,您不需要将它们转换为java
date
class


您的示例存在一个问题,即使用
列表
接口中定义的Java 8
排序
方法,使用实用程序类
集合
,这是错误的,您不需要提供集合作为第一个参数。

您的问题到底是什么?你的程序怎么会不按预期执行?这是编译吗?@Marvin这个主要问题是试图找出如何按时间字符串对对象列表进行排序。谢谢你的建议。数据约定不是由我决定的,与数据建模者的斗争也不值得。我知道date这个名字选得不好。我想在这种情况下,我可以用LocalDateTime来代替,但是你写的东西肯定更干净。我还有一个警告,这是我还没有得到的东西,但一旦我弄明白了这一点,我会去调查。假设时间是“23:30”,“24:00”,“24:30”,“01:00”,“01:30”,“02:00”。这将意味着午夜过后,需要在午夜之后到来。我如何解释这一点?据我所知,这就是这方面的要求范围。我试图在我的原始答案中尽可能简洁,但完全忘记了包括这一点。但《纽约时报》需要保持在最终回归时的状态,因为所有重要的要求都应该在问题中说明。理想情况下,使用示例输入和预期输出,尤其是您需要处理的棘手问题。如果你忘了做那件事,在你收到答复后再改变就太晚了。在这种情况下使用此网站的正确方法是提出新问题。下次一定要把所有重要的细节都包括进去。在最初的问题出现时,我还没有真正想到这一点。我后来意识到了这一点,但老实说,我认为这一点需要在数据从其他服务传递给我的方式上进行更改。这并不像现在这样强大。谢谢你的帮助。我向亚诺斯提到,我还有一个警告,这是我还没有得到的东西,但一旦我弄明白了这一点,我将进行调查。假设时间是“23:30”,“24:00”,“24:30”,“01:00”,“01:30”,“02:00”。这将意味着午夜过后,需要在午夜之后到来。我如何解释这一点?@Crislips你能提供一个错误定义的时间与正确定义的时间混合的例子,以及你的期望吗?如果我理解正确,我的意思是。我需要查看这些时间的发生顺序,而不仅仅是数量。假设我有一个@Vladimir L的情况,时间过了午夜,时间依次增加。我需要有一个对象列表,它的排序如下:“23:30”,“24:00”,“24:30”,“01:00”,“01:30”,“02:00”。但根据目前的代码,它们将被分类为:“01:00”、“01:30”、“02:00”、“23:30”、“24:00”、“24:30:@Crislips您如何决定开始订购的时间?如果“01:30”记录属于“23:30”记录的一天,而不是第二天,并且只是巧合地在“23:30”记录之后输入,该怎么办?我的意思是,想象有一个序列:“17:50”,“01:30”,“17:40”,“20:30”,“23:12”,“01:31”,“01:30”-这是怎么回事
    volumeResources.sort((v1, v2) -> v1.getDate().compareTo(v2.getDate()));