15

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

val data = List(('a', List(1, 0)), ('b', List(1, 1)), ('c', List(0)))

该列表具有以下签名:

List[(Char, List[Int])]

我的任务是从“data”中的一个元组中获取“List[Int]”元素,该元组的键是例如字母“b”。如果我实现像“findIntList(data, 'b')”这样的方法,那么我期望 List(1, 1) 作为结果。我尝试了以下方法:

  1. data.foreach { elem => if (elem._1 == char) return elem._2 }
  2. data.find(x=> x._1 == ch)
  3. for (elem <- data) yield elem match {case (x, y: List[Bit]) => if (x == char) y}
  4. for (x <- data) yield if (x._1 == char) x._2

使用所有方法(除了方法 1,我使用了明确的“返回”),我得到一个List[Option]List[Any]我不知道如何从中提取“ List[Int]”。

4

5 回答 5

22

多种方式之一:

data.toMap.get('b').get

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

或者您可以使用:

data.find(_._1 == 'b').get._2 

注意Option:仅当您可以保证您将拥有 aSome而不是 a时才使用 get on None。请参阅http://www.scala-lang.org/api/current/index.html#scala.Option了解如何使用 Option 惯用语。

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

方法 2:find 返回一个 Option[List[Int]] 因为它不能保证找到匹配的元素。

方法3:在这里你基本上做了一个map,即你将一个函数应用于你的集合的每个元素。对于您要查找的元素,该函数返回您的 List[Int] 的所有其他元素,它包含的值()是该Unit值,大致相当于voidJava 中的值,但它是一个实际类型。由于“List[Int]”和“Unit”的唯一常见超类型是“Any”,因此结果是“List[Any]”。

方法4与#3基本相同

于 2013-04-25T04:42:30.847 回答
1

另一种方法是

data.toMap.apply('b')

或者通过一个中间步骤,这会更好:

val m = data.toMap
m('b')

whereapply被隐式使用,即最后一行等价于

m.apply('b')
于 2013-04-25T05:14:05.383 回答
1

有多种方法可以做到这一点。另一种方法:

scala> def listInt(ls:List[(Char, List[Int])],ch:Char) = ls filter (a => a._1 == ch) match {
 | case Nil => List[Int]()
 | case x ::xs => x._2
 | }
listInt: (ls: List[(Char, List[Int])], ch: Char)List[Int]
scala> listInt(data, 'b')
res66: List[Int] = List(1, 1)
于 2013-04-25T05:52:16.327 回答
0

您可以通过添加类型信息来尝试类似(当您确定它存在时)。

val char = 'b'
data.collect{case (x,y:List[Int]) if x == char => y}.head

或者headOption如果您不确定角色是否存在,请使用

data.collect{case (x,y:List[Int]) if x == char => y}.headOption
于 2013-04-25T05:55:41.893 回答
0

您也可以使用模式匹配来解决这个问题。请记住,您需要使其递归。解决方案应该是这样的;

def findTupleValue(tupleList: List[(Char, List[Int])], char: Char): List[Int] = tupleList match {
  case (k, list) :: _ if char == k => list
  case _ :: theRest => findTupleValue(theRest, char)
}

这将做的是递归地遍历你的元组列表。检查 head 元素是否符合您的条件(您正在寻找的键),然后返回它。或继续列表的其余部分。

于 2015-07-22T19:17:41.323 回答