2014-10-21 2 views
14

Мы имеем следующую последовательность в нашем коде:Построить последовательность связанных временных имен

val halfHourlyColumnNames = Seq("t0000", "t0030", "t0100", "t0130", "t0200", "t0230", "t0300", "t0330", "t0400", "t0430", "t0500", "t0530", "t0600", "t0630", "t0700", "t0730", "t0800", "t0830", "t0900", "t0930", "t1000", "t1030", "t1100", "t1130", "t1200", "t1230", "t1300", "t1330", "t1400", "t1430", "t1500", "t1530", "t1600", "t1630", "t1700", "t1730", "t1800", "t1830", "t1900", "t1930", "t2000", "t2030", "t2100", "t2130", "t2200", "t2230", "t2300", "t2330")

Я хотел бы переписать это в гораздо более сжатой форме. Какой был бы самый короткий способ создать описанную выше последовательность в Scala?

ответ

16

Здесь вы идете:

scala> (0 to 23).flatMap(h => List(0,30).map(m => "t%02d%02d".format(h,m))) 
res8: scala.collection.immutable.IndexedSeq[String] = Vector(
t0000, t0030, t0100, t0130, t0200, t0230, t0300, t0330, t0400, t0430, t0500, 
t0530, t0600, t0630, t0700, t0730, t0800, t0830, t0900, t0930, t1000, t1030, 
t1100, t1130, t1200, t1230, t1300, t1330, t1400, t1430, t1500, t1530, t1600, 
t1630, t1700, t1730, t1800, t1830, t1900, t1930, t2000, t2030, t2100, t2130, 
t2200, t2230, t2300, t2330) 

Использование Scala 2.10: for понимание и интерполяцию строки с форматированием:

scala> for(h <- 0 to 23; m <- Seq(0,30)) yield f"t$h%02d$m%02d" 
res6: scala.collection.immutable.IndexedSeq[String] = Vector(
    t0000, t0030, t0100, t0130, t0200, t0230, t0300, t0330, t0400, t0430, t0500, 
    t0530, t0600, t0630, t0700, t0730, t0800, t0830, t0900, t0930, t1000, t1030, 
    t1100, t1130, t1200, t1230, t1300, t1330, t1400, t1430, t1500, t1530, t1600, 
    t1630, t1700, t1730, t1800, t1830, t1900, t1930, t2000, t2030, t2100, t2130, 
    t2200, t2230, t2300, t2330) 
16

Для постижений является более показательным для декартова произведения

scala> for { 
     | hour <- 0 to 23 
     | minutes <- List(0, 30) 
     | } yield "t%02d%02d".format(hour, minutes) 
    res0: scala.collection.immutable.IndexedSeq[String] = Vector(t0000, t0030, t0100, t0130, t0200, t0230, t0300, t0330, t0400, t0430, t0500, t0530, t0600, t0630, t0700, t0730, t0800, t0830, t0900, t0930, t1000, t1030, t1100, t1130, t1200, t1230, t1300, t1330, t1400, t1430, t1500, t1530, t1600, t1630, t1700, t1730, t1800, t1830, t1900, t1930, t2000, t2030, t2100, t2130, t2200, t2230, t2300, t2330) 
+0

Я очень как эта версия, но я отметил ответ @ tuxdna как правильный, потому что он короче, и я просил кратчайший путь. – joscas

+0

@ joscas Два решения абсолютно одинаковы, поскольку для понимания переводится непосредственно в решение 'flatMap' и' map'. Это может совпадать с одной строкой. На самом деле, я бы сказал, что это решение несколько читаемо в этом формате. –

4

изменение:

for { time <- 0 to 47 } 
    yield "t%02d%02d".format(time/2, (if(time % 2 == 0) 0 else 30)) 

res0: scala.collection.immutable.IndexedSeq[String] = 
Vector(t0000, t0030, t0100, t0130, t0200, t0230, t0300, t0330, t0400, t0430, t0500, 
t0530, t0600, t0630, t0700, t0730, t0800, t0830, t0900, t0930, t1000, t1030, t1100, 
t1130, t1200, t1230, t1300, t1330, t1400, t1430, t1500, t1530, t1600, t1630, t1700, 
t1730, t1800, t1830, t1900, t1930, t2000, t2030, t2100, t2130, t2200, t2230, t2300, 
t2330) 
4

Просто для удовольствия ..

scala> (0 to 2330).map(x => f"t$x%04d").filter(_.matches(".*(00|30)$")) 
res20: scala.collection.immutable.IndexedSeq[String] = Vector(t0000, t0030, t0100, t0130, t0200,  
t0230, t0300, t0330, t0400, t0430, t0500, t0530, t0600, t0630,t0700, t0730, t0800, t0830, t0900, 
t0930, t1000, t1030, t1100, t1130, t1200, t1230, t1300, t1330, t1400, t1430, t1500, t1530, t1600,  
t1630, t1700, t1730, t1800, t1830, t1900, t1930, t2000, t2030, t2100, t2130, t2200, t2230, t2300,t2330) 
+0

Хороший тоже. Немного запутанный :-) – joscas

+0

Да, я никогда не смогу использовать его, но это было весело :) – mohit

8

Самый короткий путь я знаю, чтобы сделать это с помощью интерполяции строк и с помощью деления и модуля, чтобы получить 30-х годов:

(0 to 47).map(i => f"t${i/2}%02d${30*(i%2)}%02d") 
+0

Это действительно круто! – tuxdna

Смежные вопросы