Сортировать по дате в формате String в Scala Object - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующая структура объектов в scala (классы дел):

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

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

        }
    }]
}

Посмотрите на список "аккаунтов". Я хочу отсортировать этот список на основе поля "submitDate" из "accountManagement". Обратите внимание, что отправленная дата представлена ​​в строковом формате.

Я пробовал это, но не работает.

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)

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Если я правильно понимаю ваше требование, вы можете сначала собрать список AccountManagementNew из AccountManagement, преобразовав дату типа String в LocalDate, а затем выполнить сортировку по дате, как показано ниже. Обратите внимание, что 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)
// )
0 голосов
/ 07 мая 2018

Допустим, класс вашего дела выглядел следующим образом.

// 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...