簡體   English   中英

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

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

我在scala(案例類)中具有關注對象結構:

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

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

        }
    }]
}

查看列表“帳戶”。 我想基於“ accountManagement”中的“ submittedDate”字段對該列表進行排序。 請注意,提交日期為字符串格式。

我嘗試了這個,但是沒有用。

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)

可以說您的案例類看起來像這樣。

// 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")

您可以定義要在此上下文中使用的隱式順序

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

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

或者您可以直接指定您想要使用上述日期的毫秒表示來對數據集進行排序

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

如果我正確理解了您的要求,則可以通過將String類型的日期轉換為LocalDate ,首先從AccountManagement組裝一個AccountManagementNew列表,然后按日期進行排序,如下所示。 請注意, 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