如何使用Java对对象列表进行排序

时间:2019-04-15 08:36:23

标签: java list sorting datetime object

我有2个列表,这些列表包含相同的对象但无序,并且我想在比较它们之前首先对它们进行排序,以检查它们是否相等。

每个列表中的一项如下所示:

第一个列表:

AuditRow{dateStr='2019-04-15 11:16', userStr='admin', entityStr='Users'}

第二个列表:

AuditRow{dateStr='2019-04-15 10:28', userStr='admin', entityStr='Users'}

我尝试使用比较器解决此问题,但未成功 我必须说,两个清单都有10多个项目。

我想实现按日期时间对列表进行排序的目标(主要取决于小时,因为所有项目的日期都相同)。

这是我尝试过的:

    Override
    public int compareTo(AuditRow auditRow) {
        int compareage = Integer.parseInt(((AuditRow)auditRow).dateStr.replace(" ",""));
        return Integer.parseInt(this.dateStr.replace(" ",""))-compareage; 
    }

但这并不能解决问题

3 个答案:

答案 0 :(得分:2)

如果要按dateStr对其进行排序:

list.sort((obj1,obj2) ->{SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm");
return sdf.parse(obj1.getDate()).compareTo(sdf.parse(obj2.getDate());}

我假设dateStr是一个字符串,所以我在此处包括了转换,如果它们已经是日期,则只需执行(obj1,obj2) -> obj1.getDate().compareTo(obj2.getDate())

编辑:正如@RobertKock所指出的,您甚至不需要将字符串转换为日期,就可以直接比较它而无需任何转换。

答案 1 :(得分:1)

我不知道您对比较器尝试了什么。 您是否尝试过像这样使用

首先,根据要在案例date time中使用的字段,创建一个比较器。

Comparator<AuditRow> compareByDate = (AuditRow a1, AuditRow a2) -> a1.getDateStr().compareTo(a2.getDateStr());

然后将上面创建的比较器用作排序参数:

Collections.sort(auditRowList, compareByDate);

答案 2 :(得分:1)

使用比较器:

List(AuditRow) myList;
Collections.sort(myList, new Comparator<AuditRow>{
    public int compare(AuditRow ar1, AuditRow ar2) {
        return ar1.getDateStr().compareTo(ar2.getDateStr());
    }
});

与上述相同,但使用的是lambda表达式(Java 8 +):

List(AuditRow) myList;
Collections.sort(myList, (ar1, ar2) -> 
        ar1.getDateStr().compareTo(ar2.getDateStr()});

如果比较器是通过比较属性创建的,则可以使用:

List(AuditRow) myList;
myList.sort(myList, 
        Comparator.comparing(AuditRow::getDateStr)
            .thenComparing(AuditRow::userStr));