我们有一个配对列表,例如如下
val listPairs = List(("a", "a"), ("b", "a"), ("d", "d"), ("a", "c"))
我想查找是否存在i != j
这样的
listPairs(i)._1 = listPairs(j)._2
并打印找到的第一个这样的i, j
。
所以对于listPairs
肯定有i = 0, j = 1
我一个人唯一能找到的方法就是简单地遍历每个索引i, j, i < j
的列表并进行比较。但这是一个带有可变变量的丑陋嵌套循环。
有人可以提出更好的方法吗?
答案 0 :(得分:2)
我对Leo的答案做了一些修改,我使用了zipWithIndex
来避免按索引访问列表。
def checkIntersections[T](pairs: List[(T, T)]): List[(Int, Int)] = {
val pairsWithIndex = pairs.zipWithIndex
val result = for {
((a, _), i) <- pairsWithIndex
((_, b), j) <- pairsWithIndex
if i != j && a == b
} yield (i, j)
result.toList
}
checkIntersections(List(("a", "a"), ("b", "a"), ("d", "d"), ("a", "c")))
// res0: List[(Int, Int)] = List((0,1), (3,0), (3,1))
答案 1 :(得分:1)
您可以将User-agent: *
Disallow:
与NSURL* captionPrefs = [NSURL URLWithString:@"somevalidurl"];
[[NSWorkspace sharedWorkspace] openURL:captionPrefs];
一起使用,如下所示:
for-comprehension
仅需要与i guard
答案 2 :(得分:1)
使用尾部递归
val listPairs = List(("a", "a"), ("b", "c"), ("d", "d"), ("y", "a"))
def res(lst: List[(String,String)], count: Int): Option[(Int,Int)] = {
if (lst.isEmpty) return None
lst.tail.indexWhere(_._2 == lst.head._1) match {
case -1 => res(lst.tail, count+1)
case a: Int => Some((count,count+a+1))
}
}
println(res(listPairs, 0))
输出:Some((0,3))