Как преобразовать DateTimeComparator в Ordering [DateTime] в Scala - PullRequest
4 голосов
/ 23 апреля 2011

Я только что набрал это, что кажется немного уродливым:

val maxTime = times.max(DateTimeComparator.getInstance().asInstanceOf[Comparator[DateTime]] asScala)

times - это последовательность org.joda.time.DateTime.

Должен быть лучший способполучить этот объект Ordering для DateTime.Есть ли?

В частности, было бы здорово потерять asInstanceOf ...

Ответы [ 5 ]

5 голосов
/ 12 марта 2012

Другая возможность заключается в использовании comparatorToOrdering:

Ordering.comparatorToOrdering(DateTimeComparator.getInstance.asInstanceOf[Comparator[DateTime]])

Я полагаю, это то, что делает вызов asScala.Это не более красиво, я знаю: - |

(К сожалению, требуется приведение, потому что DateTimeComparator реализует Comparator как необработанный тип.)

4 голосов
/ 31 декабря 2013

Вы также можете написать свой собственный класс, который расширяет черту Ordering, и использовать ее как вход для максимальной функции:

class JodaDateTimeOrdering extends Ordering[org.joda.time.DateTime] {
  val dtComparer = DateTimeComparator.getInstance()

  def compare(x: DateTime, y: DateTime): Int = {
    dtComparer.compare(x, y)
  }
}
2 голосов
/ 17 августа 2013

Наилучшая возможность, но с дополнительной зависимостью: Оболочка NScala-Time для Joda DateTime имеет неявный DateTimeOrdering:

https://github.com/nscala-time/nscala-time/blob/master/src/main/scala/com/github/nscala_time/time/Implicits.scala

1 голос
/ 23 апреля 2011
times.max(Ordering.fromLessThan[DateTime](
  DateTimeComparator.getInstance.compare(_,_) < 0))

что тоже ужасно!

Откуда приходит ваш asScala?

дополнительные мысли

Я не уверен, что есть лучший способ. DateComparator реализует Компаратор .

метод max ожидает Ordering[DateTime]. Упорядоченные и упорядоченные инвариантны в Scala. Поэтому я думаю, что дело необходимо использовать asScala.

0 голосов
/ 29 августа 2014

Если вы хотите использовать Saddle, там определен неявный порядок Datetime, и в этом случае этого достаточно для решения проблемы:

import org.saddle.time._
...