仅通过 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
从列表 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