从Scala中的列表返回元素

从Scala中的列表返回元素,scala,list,Scala,List,我最近正在从事Scala的一个初学者项目,有一个关于Scala列表的初学者问题 假设我有一个元组列表(list[Tuple2[String,String]],例如)。是否有一种方便的方法可以从列表中返回第一次出现的指定元组,或者是否需要手动遍历列表?您可以尝试使用。(更新了scala文档的查找位置)如果你正在学习scala,我会仔细看看这个特性。它为scala的许多功能优势提供了基础 scala> val list = List(("A", "B", 1), ("C", "D", 1), ("E

我最近正在从事Scala的一个初学者项目,有一个关于Scala列表的初学者问题


假设我有一个元组列表(
list[Tuple2[String,String]]
,例如)。是否有一种方便的方法可以从列表中返回第一次出现的指定元组,或者是否需要手动遍历列表?

您可以尝试使用。(更新了scala文档的查找位置)

如果你正在学习scala,我会仔细看看这个特性。它为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>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))
如前一条评论所述,
find
可能是最简单的方法。Scala的集合中实际上有三种不同的“线性搜索”方法,每种方法返回的值略有不同。您使用哪一个取决于您需要数据做什么。例如,您需要索引,还是只需要一个布尔值
true
/
false

您也可以这样做,这不需要知道Tuple2类中的字段名,而是使用模式匹配:

list find { case (x,y,_) => x == "C" && y == "D" }
当你知道你只需要一个时,“发现”是好的;如果您想找到所有匹配的元素,您可以使用“过滤器”或等效的sugary进行理解:

for ( (x,y,z) <- list if x == "C" && y == "D") yield (x,y,z)

对于((x,y,z)以下代码可能会对您有所帮助

我有一个类似的例子,有一组基类条目(这里,
a
),我想从中找到某个派生类的节点(如果有的话)(这里,
B

这里(对于我的应用程序)的重要部分是
findByName
不会返回
Option[A]
,而是
Option[B]


您可以很容易地修改行为以返回
B
,如果未找到异常则抛出异常。希望这能有所帮助。

考虑
collectFirst
,它为第一个匹配的元组提供
一些[(字符串,字符串)]
,或者
none
,否则,例如:

xs collectFirst { case t@(a,_) if a == "existing" => t }
Some((existing,str))

scala> xs collectFirst { case t@(a,_) if a == "nonExisting" => t }
None

使用
@
我们将元组的值绑定到
t
,这样就可以收集整个匹配的元组。

您的第二个示例的功能似乎更像
过滤器
,即它将返回所有匹配属性的元素,而不是问题作者希望返回的唯一第一个。是否可以不返回一些((C,D,1))但是(C,D,1)?如果我使用列表(1),我的意思是相同的。@grass如果在列表中找不到三元组
(C,D,1)
,返回值应该是什么?无、异常或空集。如果没有找到三元组,有办法自定义返回值(除了编写我自己的find()方法),那就太好了.“None”和“Some”总是同时出现。它们构成了一个“Option[T]”。如果你的函数只是返回“T”,你必须通过一个异常来表示“None”和“Some”。我很快会添加一个答案,我认为它提供了你想要的答案(使用“find”)。你能提供关于这些“线性搜索”方法的更多信息吗?我正在寻找元组的索引(只有部分元组)实际上我已经找到了我想要的:
.zipWithIndex.collect{case(“partOfTuple”),I=>I}
xs collectFirst { case t@(a,_) if a == "existing" => t }
Some((existing,str))

scala> xs collectFirst { case t@(a,_) if a == "nonExisting" => t }
None