Lassen Sie uns mit einer Folge von ganzzahligen beginnen wie:Wie man Bereiche von zusammenhängenden Inten effizient/elegant extrahiert?
val seq = List(1,2,3,4,5,6,9,10,11,14,15,16,18)
Ich möchte eine Folge von Paaren bekommen repräsentieren zusammenhängende Sätze, wie:
val ranges = List(1,6,9,11,14,16,18,18)
Alternative Format Seq[(Int,Int)]
auch akzeptabel ist:
Erläuterung: - Ganzzahlen im Bereich 1..6
und 11..16
sind in seq
- integer 18
in seq
ist, hat aber keine Nachfolger oder Vorgänger, so scheint es, als 18,18
in ranges
Man beachte, daß Einzelelement-Sequenzen sollten immer paarweise berichtet werden, wie beispielsweise in:
val seq = List(18, 19, 21)
, die als Ergebnis geben sollte:
val ranges = List(18,19,21,21)
Oder, wenn Sie bevorzugen Tuple2 Stil:
val ranges = List((18,19),(21,21))
Ich möchte eine Funktion haben ranges
von seq
abzuleiten; eine Lösung (von einem Kollegen zur Verfügung gestellt) ist:
def toRanges(a: Seq[Int]): Seq[Int] = {
val min = a.map(x => (x, a contains x - 1)).filter(!_._2).map(_._1)
val max = a.map(x => (x, a contains x + 1)).filter(!_._2).map(_._1)
return (min ++ max).sorted
}
Welche elegant ist, in der Tat, aber ich bin mir nicht sicher über die Effizienz, von contains
aufgrund verwenden.
Kann jemand eine noch bessere Lösung in Bezug auf Effizienz oder Eleganz bieten?
Vielen Dank!
Beachten Sie, dass aus Gründen der Effizienz willen, 'a contains' könnte mit einem' contains' auf einer 'toSet' Version des gleichen' 'Seq' a' substituiert sein kann; Dies kann die Leistung bei großen 'Seq's verbessern, ohne diesen Code dramatisch zu verändern. – logtwo
Ist der Eingang garantiert bestellt? –
@TravisBrown In meinem Fall ja, aber wir könnten immer eine sortierte Methode auf Seq a anwenden, bevor wir nach Bereichen suchen.Somit würde ich sagen, dass sortierte Elemente in jedem Fall eine vernünftige Startbedingung ist. – logtwo