从Scala中的列表返回元素
时间:2020-03-05 18:50:43 来源:igfitidea点击:
我最近一直在Scala从事初学者的项目,并且对Scala的列表有初学者的疑问。
假设我有一个元组列表(例如List [Tuple2 [String,String]]
)。是否有一种便捷的方法可以从列表中返回指定元组的第一个匹配项,还是需要手动遍历列表?
解决方案
回答
我们可以尝试使用查找。 (已更新的scala-doc查找位置)
回答
如果我们正在学习scala,那么我将很好地了解Seq特性。它为scala的许多功能优势提供了基础。
回答
scala> val list = List(("A", "B", 1), ("C", "D", 1), ("E", "F", 1), ("C", "D", 2), ("G", "H", 1)) list: List[(java.lang.String, java.lang.String, Int)] = List((A,B,1), (C,D,1), (E,F,1), (C,D,2), (G,H,1)) scala> list find {e => e._1 == "C" && e._2 == "D"} res0: Option[(java.lang.String, java.lang.String, Int)] = Some((C,D,1))
回答
如先前的评论中所述,"查找"可能是实现此目的的最简单方法。实际上,Scala的集合中有三种不同的"线性搜索"方法,每种方法返回的值都略有不同。我们使用哪一种取决于我们需要什么数据。例如,我们需要索引,还是只需要布尔值" true" /" false"?
回答
我们也可以这样做,不需要知道Tuple2类中的字段名称,而是使用模式匹配:
list find { case (x,y,_) => x == "C" && y == "D" }
当我们知道只需要一个时,"查找"就很好了;如果我们想查找所有匹配的元素,则可以使用"过滤器"或者同等的含糖量进行理解:
for ( (x,y,z) <- list if x == "C" && y == "D") yield (x,y,z)