简体   繁体   English

在Scala对象中按字符串格式按日期排序

[英]Sort by date in String Format in Scala Object

I have Following Object structure in scala (case classes) : 我在scala(案例类)中具有关注对象结构:

{
    "accounts": [{
        "accountManagement": {

            "accountStatus": "submitted",
            "accountManagementId": "1513684862218",
            "submittedDate": "19/12/2017"

        }
    }]
}

Look at List "accounts". 查看列表“帐户”。 I want to sort this list on the basis of field "submittedDate" from "accountManagement". 我想基于“ accountManagement”中的“ submittedDate”字段对该列表进行排序。 Note that submitted date is in string format. 请注意,提交日期为字符串格式。

I tried this but not working. 我尝试了这个,但是没有用。

for (accountManagement: AccountManagement <- accountManagementList) {
        try {

          if(accountManagement.submittedDate != null && accountManagement.submittedDate.nonEmpty){

            accountManagement.submittedDate = dateFormatter.parse(accountManagement.submittedDate)
          }

        }catch {
          case e:Exception =>
        }

        accountManagementsNew = accountManagementsNew ::: List(accountManagement)
      }

      accountManagementsNew.sortBy(_.updatedDate.getTime)

Lets say your case class looked like this. 可以说您的案例类看起来像这样。

// Note that in scala its preferred to use Option to indicate nullable fields
case class AccountManagement(accountStatus: String,
                             accountManagementId: Long,
                             submittedDate: Option[String])

val accounts = List(
  AccountManagement("submitted", 1L, Some("21/12/2017")),
  AccountManagement("submitted", 2L, Some("19/12/2017")),
  AccountManagement("submitted", 3L, None),
  AccountManagement("submitted", 4L, Some("20/12/2017"))
)

val dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy")

You can either define an implicit ordering that you want to use in this context 您可以定义要在此上下文中使用的隐式顺序

implicit val localDateOrdering: Ordering[LocalDate] = Ordering.by(_.toEpochDay)

accounts.filterNot(_.submittedDate.isEmpty) sortBy {
  case AccountManagement(_, _, Some(submittedDateString)) => LocalDate.parse(submittedDateString, dtf)
}

or you can directly specify that you would like to use the millisecond representation of said date to sort your data set 或者您可以直接指定您想要使用上述日期的毫秒表示来对数据集进行排序

accounts.filterNot(_.submittedDate.isEmpty) sortBy {
  case AccountManagement(_, _, Some(submittedDateString)) => LocalDate.parse(submittedDateString, dtf).toEpochDay
}

If I understand your requirement correctly, you can first assemble a list of AccountManagementNew from AccountManagement by converting the String-type date to LocalDate , then perform the sorting by date as shown below. 如果我正确理解了您的要求,则可以通过将String类型的日期转换为LocalDate ,首先从AccountManagement组装一个AccountManagementNew列表,然后按日期进行排序,如下所示。 Note that Try is used to handle Success/Failure cases. 请注意, Try用于处理Success/Failure案例。

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import scala.util.{Try, Success, Failure}

case class AccountManagement(
  accountStatus: String, accountManagementId: String, submittedDate: String
)
case class AccountManagementNew(
  accountStatus: String, accountManagementId: String, updatedDate: LocalDate
)

val accountManagementList = List[AccountManagement](
  AccountManagement("submitted", "1513684862218", "19/12/2017"),
  AccountManagement("submitted", "1513684862219", "09/01/2018"),
  AccountManagement("submitted", "1513684862220", "29/11/2017")
)

val datePattern = DateTimeFormatter.ofPattern("dd/MM/yyyy")

// Assemble a list of the AccountManagementNew case class
val amNewList =
  for (am <- accountManagementList) yield {
    Try( LocalDate.parse(am.submittedDate, datePattern) ) match {
      case Success(d) =>
        AccountManagementNew(am.accountStatus, am.accountManagementId, d)
      case Failure(_) =>
        AccountManagementNew(am.accountStatus, am.accountManagementId, LocalDate.MIN)
    }
  }

// Use `LocalDate.toEpochDay` for date ordering
implicit val dateOrdering = Ordering.by{d: LocalDate => d.toEpochDay}

amNewList.sortBy(_.updatedDate)
// res1: List[AccountManagementNew] = List(
//   AccountManagementNew(submitted,1513684862220,2017-11-29),
//   AccountManagementNew(submitted,1513684862218,2017-12-19),
//   AccountManagementNew(submitted,1513684862219,2018-01-09)
// )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM