Scala - 在列表中查找特定元组

mai*_*nas 13 scala

我正在这个墙上敲我的头.(fyi,我还不是scala pro,但我很喜欢它)

假设我们有这个元组列表:

val data = List(('a', List(1, 0)), ('b', List(1, 1)), ('c', List(0)))
Run Code Online (Sandbox Code Playgroud)

该清单有这个签名:

List[(Char, List[Int])]
Run Code Online (Sandbox Code Playgroud)

我的任务是从"数据"中的元组中获取"List [Int]"元素,其关键是,例如,字母"b".

换句话说,如果我实现像"findIntList(data,'b')"这样的方法,那么我期待List(1,1)的结果

为了完成图片,我尝试了以下方法.问题是,所有的方法(除了方法1,我使用一个明确的"返回"),我要么得到一个List[Option]List[Any]对象回来,我不知道如何从中提取" List[Int]"信息

方法1:

data.foreach { elem => if (elem._1 == char) return elem._2 }
Run Code Online (Sandbox Code Playgroud)

方法2:

data.find(x=> x._1 == ch)
Run Code Online (Sandbox Code Playgroud)

方法3:

for (elem <- data) yield elem match {case (x, y: List[Bit]) => if (x == char) y}
Run Code Online (Sandbox Code Playgroud)

方法4:

for (x <- data) yield if (x._1 == char) x._2
Run Code Online (Sandbox Code Playgroud)

Jen*_*der 18

许多方法之一:

data.toMap.get('b').get
Run Code Online (Sandbox Code Playgroud)

toMap将元组的列表转换为Map从元组的第一个元素到第二个元素的a元组.get为您提供给定键的值并返回一个Option,因此您需要另一个get实际获取列表.

或者您可以使用:

data.find(_._1 == 'b').get._2 
Run Code Online (Sandbox Code Playgroud)

注意:只有Option当你可以保证你有一个Some而不是一个时才使用None.有关如何使用Option idiomatic的信息,请参见http://www.scala-lang.org/api/current/index.html#scala.Option.

更新:使用不同方法查看的结果类型的说明

方法2:find返回Option [List [Int]],因为它无法保证找到匹配的元素.

方法3:这里你基本上做了一个map,即你将一个函数应用到你的集合的每个元素.对于您要查找的元素,该函数返回List [Int],包含值(),该Unit值大致相当于voidJava,但实际类型.因为'List [Int]'和'Unit'的唯一常见超类型是'Any',所以你得到一个'List [Any]'作为结果.

方法4与#3基本相同