我想从列表中的每个项目的开头删除“America /”这个词,下面的代码就是这样,但我觉得它可以用更好的方式完成。
var tz = java.util.TimeZone.getAvailableIDs
for(i <- 0 until tz.length) {
if(tz(i).startsWith("America/")) {
tz(i) = tz(i).replaceFirst("America/", "")
}
}
答案 0 :(得分:3)
简单直接:
val tz = java.util.TimeZone.getAvailableIDs.map(_.replaceFirst("^America/", ""))
答案 1 :(得分:2)
与@ Noah的答案非常相似,但是使用for-yield迭代(这样您就可以添加其他过滤器而不再使用括号)。
import java.util.TimeZone
val tz = for(t <- TimeZone.getAvailableIDs) yield t.replaceFirst("^America/", "")
答案 2 :(得分:1)
我将使用正则表达式:
val pattern = "^America/".r
tz = tz.map(pattern.replaceFirstIn(_, ""))
想知道这是否是一种有效的方式。
答案 3 :(得分:0)
Map优先用于函数式编程中的for循环,因此不是使用for循环更改列表,而是通过映射传递数据更纯粹,(IMO)更漂亮。
答案 4 :(得分:0)
这可行:
val tzs = java.util.TimeZone.getAvailableIDs map { tz =>
if(tz.startsWith("America/")) tz.replaceFirst("America/","")
else tz
}
答案 5 :(得分:0)
如果你只想要美国时区,你可以这样做:
val americanZones = {
val pattern = "^America/(.*)".r
( java.util.TimeZone.getAvailableIDs
flatMap pattern.findFirstMatchIn
map (_ group 1) )
}
答案 6 :(得分:0)
添加了&#39; if&#39;到for / yield
val zones = java.util.TimeZone.getAvailableIDs
val formatted_zones = for(i <- 0 until zones.length if zones(i).startsWith("America/")) yield {
zones(i).replaceFirst("America/", "")
}
答案 7 :(得分:0)
没有正则表达式:
val tz = java.util.TimeZone.getAvailableIDs.map(_ stripPrefix "America/")