从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)