如何检查配对列表中是否有交集?

时间:2019-03-07 01:16:09

标签: scala collections

我们有一个配对列表,例如如下

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的列表并进行比较。但这是一个带有可变变量的丑陋嵌套循环。

有人可以提出更好的方法吗?

3 个答案:

答案 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))