indexOf用于包含隐式元素的元组列表

时间:2019-01-28 15:15:53

标签: scala

很不幸,我收到的索引为-1,而我希望收到的索引为2 有没有解决这个问题的替代方案吗?

val a = Array((1,2),(1,3),(2,1),(4,3));
a.indexOf(Tuple2[Int,Int](2,_))

3 个答案:

答案 0 :(得分:3)

没有所谓的“隐式元素”。 Tuple2[Int, Int](2, _)是部分应用的对构造函数。您的列表不包含任何构造函数,因此您会得到一个-1

如果要查找以2作为第一个元素的元组的第一个匹配项的索引,可以尝试执行以下操作:

a.indexWhere(_._1 == 2)

或者(如果您不记得有indexWhere,例如我和迪玛):

a.view.zipWithIndex.find{ case ((2, _), idx) => true ; case _ => false }.map(_._2)

a.view.zipWithIndex.collect{ case ((2, _), idx) => idx }.headOption

答案 1 :(得分:1)

是的,这是行不通的(我什至不知道您如何设法从中得到-1,它根本不应该编译)。 indexOf在数组元素上寻找完全匹配的内容,您不能给它通配符。

这样的事情会做你想要的:

a.iterator
 .zipWithIndex
 .collectFirst { case ((2, _), idx) => idx }
 .getOrElse(-1)

或者,使用indices,但这仅适用于数组:

a.indices.find(a(i)._1 == 2).getOrElse(-1)

答案 2 :(得分:1)

您可以使用indexWhere查找与函数谓词匹配的元素索引,并使用PartialFunction.cond将模式转换为这样的谓词:

scala> a.indexWhere(PartialFunction.cond(_) { case (2, _) => true })
res1: Int = 2