我需要根据他们是否在俄亥俄州排序城镇/城市列表。数据是CSV文件,所以我真的不需要检查它们是否存在。我只需要对它们进行排序。
所以这就是我的数据:
List(List("Jacksonville","Y"),List("BeverlyHills", "N"),List("NewYork","N"),List("Greensville", "Y"))
我需要将其转换为两个列表,其中一个列表是函数为true的位置,另一个列表是false。例如,在我将:
之后(List("Jacksonville","Greensville"),List("NewYork","BeveryHills");
第一个列表是函数的真实位置,第二个列表是假的。
这是我到目前为止所做的:
def isInOhio(place: String): Boolean = {
place == "Y"
}
val sortedData = data.map({ case List(a, b) => (a, isMale(b)) })
据我所知,上面的函数根据内部函数的结果将值放入一个映射中。但它也带来了''价值进入地图,我不需要。我只想要' a'列表中的值。
答案 0 :(得分:4)
您可以使用partition
方法:
def isInOhio(csvLine: List[String]) = csvLine.last == "Y"
data.partition(isInOhio)
http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List
答案 1 :(得分:0)
您可以使用groupBy
方法。这将允许您根据函数的返回值将列表分为两部分。
data.groupBy({ case List(_, value) => isInOhio(value) })
.map({
case (true, List(_, value)) => // Is in Ohio
case (false, List(_, value)) => // Not in Ohio
}).sortBy(_._2.last)
这将为您留下一个包含Tuple
布尔值和原始值(Boolean, List(a, b))
的列表,其中Boolean
值是isInOhio
的结果功能:
List((true, List(a, b),
(false, List(a, b)
...)
现在,如果您只想保留其中一个元素,只需从map
函数返回:
case (true, List(_, value)) => value
你会得到:
List((true, b,
(false, b
...)
答案 2 :(得分:0)
如果您只想对俄亥俄州的城市进行排序,您可以执行以下操作:
val cities = List("Jacksonville", "Greensville", "New York", "Beverly Hills")
val sortedOhioCities = cities.filter(isInOhio(_)).sorted
答案 3 :(得分:0)
考虑改为使用内部列表元组,然后使用分区方法
def isMale(str: String): Boolean = ???
List(("Jacksonville","Y"),("BeverlyHills", "N"),("NewYork","N"),("Greensville", "Y"))
.partition {
case (city, toggle) => isMale(toggle)
} match {
case (l1, l2) => (l1.map(_._1), l2.map(_._1))
}
这将产生(List("Jacksonville","Greensville"),List("NewYork","BeveryHills"))