Scala:如何根据函数将值映射到列表中

时间:2016-02-10 18:01:58

标签: list scala sorting csv dictionary

我需要根据他们是否在俄亥俄州排序城镇/城市列表。数据是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'列表中的值。

4 个答案:

答案 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"))