仅通过 Date 组件从 DateTime 对象列表中删除重复项

Remove duplicates from list of DateTime objects only by Date component

从列表 Joda DateTime 对象中删除重复项但仅按日期组件(无时间组件)的首选方法是什么

var dates = List[DateTime]()

dates = dates ::: List(new DateTime(2015, 1, 1, 0, 0, 0, 0))
dates = dates ::: List(new DateTime(2011, 1, 1, 0, 0, 0, 1))
dates = dates ::: List(new DateTime(2011, 1, 1, 0, 0, 0, 0)) // different millisOfSecond

println(dates.distinct)

结果

List(2015-01-01T00:00:00.000+01:00,
     2011-01-01T00:00:00.001+01:00,
     2011-01-01T00:00:00.000+01:00)

使用 JodaTime DateTimeComparator.getDateOnlyInstance() 方法。这为您提供了一个仅按日期进行比较的 DateTimeComparator。在 http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

查看 API

编写一个包装器 class 并覆盖 equals 方法以根据日期组件进行相等。

case class DateTimeWrapper(dt: DateTime) {
  override def equals(obj: scala.Any): Boolean = obj match {
    case x: DateTimeWrapper => x.dt.getDayOfMonth == this.dt.getDayOfMonth
    case _ => false
  }
}

这里是 distinct 方法,它使用 Set 来选择非重复元素

def distincts(list: List[DateTime]): List[DateTime] = {
  def helper(set: Set[DateTimeWrapper], list: List[DateTimeWrapper]) = list match {
    case Nil => set
    case x :: xs => if (set contains x) set else set + x
  }
  helper(Set.empty[DateTimeWrapper], list.map(DateTimeWrapper)).toList.map(_.dt)
}

写一个 Implicit 使 API 看起来更好

implicit class ListUtils(list: List[DateTime]) {
  def distinctElems = distincts(list)
}

用法:

val dates = List(
  new DateTime(2015, 1, 1, 0, 0, 0, 0),
  new DateTime(2011, 1, 1, 0, 0, 0, 1),
  new DateTime(2011, 1, 1, 0, 0, 0, 0)
)

println(dates.distinctElems.length)

我是这样做的:

def orderAndDeleteDuplicatesList(unorderedList: List[DateTime]): List[DateTime] ={


if(unorderedList == Nil || unorderedList.isEmpty) return unorderedList


//order by millis
val sortedList : List[DateTime] =  unorderedList.sortBy(_.getMillis)
var previousElement :Option[DateTime] = None
var purgedAndSortedList = List[DateTime]() //return list
sortedList.foreach ( element  => {

  //Ako trenutni element nije jednak prethodnom ili je prethodni prazan dodaj ga na listu
  if(previousElement.isEmpty || dtc.compare(previousElement.get, element) != 0 ){
    purgedAndSortedList = purgedAndSortedList ::: List(element)
  }

  previousElement = Option(element)

})

purgedAndSortedList
}

日期比较器:

import org.joda.time.{DateTime, DateTimeComparator}

private val dtc: DateTimeComparator = DateTimeComparator.getDateOnlyInstance