【问题标题】:How to sort lists of objects using java如何使用java对对象列表进行排序
【发布时间】:2019-09-05 04:59:36
【问题描述】:

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

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

第一个列表:

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

第二个列表:

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

我尝试使用 Comparator 解决这个问题,但没有成功 我必须说,这两个列表都有超过 10 个项目。

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

这是我尝试过的:

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

但这并没有成功

【问题讨论】:

  • Comparator 将是正确的方法。你在那里尝试了什么,什么没有成功?
  • 您希望如何对它们进行排序。并粘贴您已经尝试过的内容。
  • @user2478398 这是我尝试过的: 覆盖 public int compareTo(AuditRow auditRow) { int compareage = Integer.parseInt(((AuditRow)auditRow).dateStr.replace(" ","")) ; return Integer.parseInt(this.dateStr.replace(" ",""))-compareage;但这并没有成功
  • 感谢您提供更多信息。请始终在问题本身中添加此类内容。只是这一次我为你做了。
  • 不要将日期和时间作为字符串存储在您的 AuditRow 对象中。如果您不知道时区,LocalDateTime 将是用于日期和时间的类型。如果你这样做,ZonedDateTimeInstant 会更合适。然后只需使用Comparator.comparing(ar -> ar.dateTime)。或者更好的是,提供一个 getter 而不是公开一个公共字段。

标签: java list sorting datetime object


【解决方案1】:

如果你想按 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 指出的那样,您甚至不需要将字符串转换为日期,您可以直接比较它而无需任何转换。

【讨论】:

  • 由于 dateStr(如果它实际上是一个字符串)的格式为 YYYYMMDD HHMM,因此字母顺序与时间顺序一致。因此,无需将其转换为日期。
  • @vc73您的示例中的列表是什么,您是否插入要比较的两个列表?
  • 这只是你需要整理的列表之一,obj1 和 obj2 是 AuditRow 对象。
  • 虽然答案看起来正确并且我同意解析日期时间字符串,但请不要教年轻人使用早已过时且臭名昭著的麻烦 SimpleDateFormat 类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
  • 我只想说我同意@vc73 并认为您应该String 转换为Date。仅仅因为这些示例没有时区或类似的,并不意味着没有任何数据(即使如此,它只是让 IMO 变得不那么脆弱)。
【解决方案2】:

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

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

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

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

Collections.sort(auditRowList, compareByDate);

【讨论】:

    【解决方案3】:

    使用比较器:

    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));
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多