Skip to content

Instantly share code, notes, and snippets.

@urcadox
Last active January 4, 2016 19:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save urcadox/8670215 to your computer and use it in GitHub Desktop.
Save urcadox/8670215 to your computer and use it in GitHub Desktop.
Get the opposite of a List[Interval] in Scala
import org.joda.time.{Interval, Instant}
val intervals = List(
new Interval(new Instant("2014-01-25T12:00"), new Instant("2014-01-27T08:00")),
new Interval(new Instant("2014-01-27T18:00"), new Instant("2014-01-28T08:00")),
new Interval(new Instant("2014-01-28T18:00"), new Instant("2014-01-29T08:00")),
new Interval(new Instant("2014-01-29T18:00"), new Instant("2014-01-30T08:00")),
new Interval(new Instant("2014-01-30T18:00"), new Instant("2014-01-31T08:00")),
new Interval(new Instant("2014-01-31T18:00"), new Instant("2014-02-01T08:00")),
new Interval(new Instant("2014-02-01T12:00"), new Instant("2014-02-03T08:00")),
new Interval(new Instant("2014-02-03T18:00"), new Instant("2014-02-04T08:00")),
new Interval(new Instant("2014-02-04T18:00"), new Instant("2014-02-05T08:00")),
new Interval(new Instant("2014-02-05T18:00"), new Instant("2014-02-06T08:00")),
new Interval(new Instant("2014-02-06T18:00"), new Instant("2014-02-07T08:00")),
new Interval(new Instant("2014-02-07T18:00"), new Instant("2014-02-08T08:00")),
new Interval(new Instant("2014-02-08T12:00"), new Instant("2014-02-10T08:00")),
new Interval(new Instant("2014-01-27T08:00"), new Instant("2014-01-27T10:00")),
new Interval(new Instant("2014-01-27T10:00"), new Instant("2014-01-27T12:00")),
new Interval(new Instant("2014-01-27T12:00"), new Instant("2014-01-27T15:00")),
new Interval(new Instant("2014-01-27T15:00"), new Instant("2014-01-27T18:00")),
new Interval(new Instant("2014-01-28T08:00"), new Instant("2014-01-28T10:00")),
new Interval(new Instant("2014-01-28T10:00"), new Instant("2014-01-28T12:00")),
new Interval(new Instant("2014-01-28T12:00"), new Instant("2014-01-28T15:00")),
new Interval(new Instant("2014-01-28T15:00"), new Instant("2014-01-28T18:00")),
new Interval(new Instant("2014-01-29T08:00"), new Instant("2014-01-29T10:00")),
new Interval(new Instant("2014-01-29T10:00"), new Instant("2014-01-29T12:00")),
new Interval(new Instant("2014-01-29T12:00"), new Instant("2014-01-29T15:00")),
new Interval(new Instant("2014-01-29T15:00"), new Instant("2014-01-29T18:00")),
new Interval(new Instant("2014-01-30T08:00"), new Instant("2014-01-30T10:00")),
new Interval(new Instant("2014-01-30T10:00"), new Instant("2014-01-30T12:00")),
new Interval(new Instant("2014-01-30T12:00"), new Instant("2014-01-30T15:00")),
new Interval(new Instant("2014-01-30T15:00"), new Instant("2014-01-30T18:00")),
new Interval(new Instant("2014-01-31T08:00"), new Instant("2014-01-31T10:00")),
new Interval(new Instant("2014-01-31T10:00"), new Instant("2014-01-31T12:00")),
new Interval(new Instant("2014-01-31T12:00"), new Instant("2014-01-31T15:00")),
new Interval(new Instant("2014-01-31T15:00"), new Instant("2014-01-31T18:00")),
new Interval(new Instant("2014-02-01T08:00"), new Instant("2014-02-01T10:00")),
new Interval(new Instant("2014-02-01T10:00"), new Instant("2014-02-01T12:00")),
new Interval(new Instant("2014-02-03T08:00"), new Instant("2014-02-03T10:00")),
new Interval(new Instant("2014-02-03T10:00"), new Instant("2014-02-03T12:00")),
new Interval(new Instant("2014-02-03T12:00"), new Instant("2014-02-03T15:00")),
new Interval(new Instant("2014-02-03T15:00"), new Instant("2014-02-03T18:00")),
new Interval(new Instant("2014-02-04T08:00"), new Instant("2014-02-04T10:00")),
/* new Interval(new Instant("2014-02-04T10:00"), new Instant("2014-02-04T12:00")),*/
new Interval(new Instant("2014-02-04T12:00"), new Instant("2014-02-04T15:00")),
new Interval(new Instant("2014-02-04T15:00"), new Instant("2014-02-04T18:00")),
new Interval(new Instant("2014-02-05T08:00"), new Instant("2014-02-05T10:00")),
new Interval(new Instant("2014-02-05T10:00"), new Instant("2014-02-05T12:00")),
new Interval(new Instant("2014-02-05T12:00"), new Instant("2014-02-05T15:00")),
new Interval(new Instant("2014-02-05T15:00"), new Instant("2014-02-05T18:00")),
new Interval(new Instant("2014-02-06T08:00"), new Instant("2014-02-06T10:00")),
/* new Interval(new Instant("2014-02-06T10:00"), new Instant("2014-02-06T12:00")),*/
new Interval(new Instant("2014-02-06T12:00"), new Instant("2014-02-06T15:00")),
new Interval(new Instant("2014-02-06T15:00"), new Instant("2014-02-06T18:00")),
/* new Interval(new Instant("2014-02-07T08:00"), new Instant("2014-02-07T10:00")),*/
new Interval(new Instant("2014-02-07T10:00"), new Instant("2014-02-07T12:00")),
new Interval(new Instant("2014-02-07T12:00"), new Instant("2014-02-07T15:00")),
new Interval(new Instant("2014-02-07T15:00"), new Instant("2014-02-07T18:00")),
new Interval(new Instant("2014-02-08T08:00"), new Instant("2014-02-08T10:00")),
new Interval(new Instant("2014-02-08T10:00"), new Instant("2014-02-08T12:00"))
)
def invert(list: List[Interval]): List[Interval] = {
@annotation.tailrec
def work(list: List[Interval], interval: Interval, invertedList: List[Interval]): List[Interval] = {
if(list.isEmpty) {
invertedList.reverse
} else {
val newinterval = new Interval(interval.getEnd.toInstant, list.head.getStart.toInstant)
if(newinterval.toDurationMillis > 0) {
work(list.tail, list.head, newinterval :: invertedList)
} else {
work(list.tail, list.head, invertedList)
}
}
}
val sorted = list sortBy(_.getStartMillis)
sorted.headOption map { firstInterval =>
work(sorted.tail, firstInterval, List())
} getOrElse List()
}
scala> :load Intervals.scala
[...]
scala> invert(intervals)
res0: List[org.joda.time.Interval] = List(2014-02-04T10:00:00.000Z/2014-02-04T12:00:00.000Z, 2014-02-06T10:00:00.000Z/2014-02-06T12:00:00.000Z, 2014-02-07T08:00:00.000Z/2014-02-07T10:00:00.000Z)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment