比较两个列表并获取相同元素的索引

时间:2017-04-15 17:29:58

标签: scala arraylist

val a = List(1,1,1,0,0,2)
val b = List(1,0,3,2)

我想得到"列表b"的元素索引列表。存在于"列出a"。 这里输出为List(0,1,3)

我试过这个

for(x <- a.filter(b.contains(_))) yield a.indexOf(x))

对不起。我错过了这个。列表大小可能会有所不同编辑了列表

有更好的方法吗?

5 个答案:

答案 0 :(得分:3)

如果你想要一个索引的结果,从索引开始通常很有用。

b.indices.filter(a contains b(_))

REPL测试。

scala> val a = List(1,1,1,0,0,2)
a: List[Int] = List(1, 1, 1, 0, 0, 2)

scala> val b = List(1,0,3,2)
b: List[Int] = List(1, 0, 3, 2)

scala> b.indices.filter(a contains b(_))
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 3)

答案 1 :(得分:2)

val result = (a zip b).zipWithIndex.flatMap {
  case ((aItem, bItem), index) => if(aItem == bItem) Option(index) else None
}

a zip b将返回b中具有匹配对的中的所有元素。 例如,如果a更长,就像在您的示例中一样,结果将是List((1,1),(1,0),(1,3),(0,2))(列表将是b.length long)。
然后你还需要索引,即zipWithIndex 由于您只需要索引,因此返回Option[Int]并展平它。

答案 2 :(得分:2)

您可以使用索引for

for{ i <- 0 to b.length-1
     if (a contains b(i))
   } yield i

答案 3 :(得分:1)

scala> for(x <- b.indices.filter(a contains b(_))) yield x;
res27: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 3)

答案 4 :(得分:0)

这是另一种选择:

scala> val a = List(1,1,1,0,0,2)
a: List[Int] = List(1, 1, 1, 0, 0, 2)

scala> val b = List(1,0,3,2)
b: List[Int] = List(1, 0, 3, 2)

scala> b.zipWithIndex.filter(x => a.contains(x._1)).map(x => x._2)
res7: List[Int] = List(0, 1, 3)

我还想指出你最初的想法:在b中查找a中的元素,然后获取这些元素的索引将不起作用,除非{{1}中的所有元素} b中包含的{}为唯一,a返回第一个元素的索引。抬起头来。