You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中按字符串格式日期对Account对象列表排序的问题

解决Scala中按字符串日期排序Accounts列表的问题

我来帮你搞定这个排序问题!你之前的代码没生效,大概率是因为直接对submittedDate的字符串值进行排序——字符串是按字典序比较的,这和实际的日期顺序完全不一样(比如"10/12/2019"字符串会比"05/01/2020"大,但实际日期前者更早)。咱们一步步来解决:

1. 先定义匹配JSON结构的Case Class

首先得把你给出的JSON结构映射成Scala的case class,这样才能在代码里操作这些数据:

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import scala.util.Try

// 嵌套结构对应JSON里的accountManagement
case class AccountManagement(
  accountStatus: String,
  accountManagementId: String,
  submittedDate: String
)

// 单个账户结构
case class Account(accountManagement: AccountManagement)

// 顶层数据结构
case class AccountData(accounts: List[Account])

2. 核心:把字符串日期转成可比较的日期类型

我们需要用DateTimeFormatter把dd/MM/yyyy格式的字符串转成LocalDate(Java 8+的日期类,线程安全且易用),再基于这个日期对象排序。

升序排序(最早日期在前)

// 创建对应格式的日期解析器
val dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy")

// 假设你有一个AccountData实例叫accountData
val sortedAccountsAsc = accountData.accounts.sortBy { account =>
  // 将字符串日期解析为LocalDate,用于排序
  LocalDate.parse(account.accountManagement.submittedDate, dateFormatter)
}

降序排序(最新日期在前)

有两种方式实现降序:

// 方式1:用sortWith直接比较两个日期
val sortedAccountsDesc = accountData.accounts.sortWith { (acc1, acc2) =>
  val date1 = LocalDate.parse(acc1.accountManagement.submittedDate, dateFormatter)
  val date2 = LocalDate.parse(acc2.accountManagement.submittedDate, dateFormatter)
  date1.isAfter(date2)
}

// 方式2:先升序再反转,代码更简洁
val sortedAccountsDesc = accountData.accounts.sortBy { account =>
  LocalDate.parse(account.accountManagement.submittedDate, dateFormatter)
}.reverse

3. 处理日期格式异常(可选但推荐)

如果你的数据里存在格式不正确的日期字符串,直接解析会抛出DateTimeParseException。可以用Try来安全处理:

val sortedAccountsSafe = accountData.accounts.sortBy { account =>
  // 解析失败的话,默认用最小的日期(会排在最前面),也可以根据需求调整
  Try(LocalDate.parse(account.accountManagement.submittedDate, dateFormatter))
    .getOrElse(LocalDate.MIN)
}

为什么之前的代码没生效?

举个例子:字符串"19/12/2017"和"01/01/2018",按字符串比较时"19..."会比"01..."大,所以排序后"19/12/2017"会排在后面,但实际日期2017-12-19早于2018-01-01,这就和预期相反了。必须转成日期对象再比较才能得到正确的顺序。

内容的提问来源于stack exchange,提问作者Nilesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:53:44