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
相关产品推荐
相关产品推荐

