val a = List(1,1,1,0,0,2)
val b = List(1,0,3,2)
我想要獲得「列表a」中存在的「列表b」元素的索引列表。 輸出。這裏是清單(0,1,3)比較兩個列表並獲取相同元素的索引
我想這
for(x <- a.filter(b.contains(_))) yield a.indexOf(x))
對不起。我錯過了這一點。列表大小可能會有所不同。編輯清單
有沒有更好的方法來做到這一點?
val a = List(1,1,1,0,0,2)
val b = List(1,0,3,2)
我想要獲得「列表a」中存在的「列表b」元素的索引列表。 輸出。這裏是清單(0,1,3)比較兩個列表並獲取相同元素的索引
我想這
for(x <- a.filter(b.contains(_))) yield a.indexOf(x))
對不起。我錯過了這一點。列表大小可能會有所不同。編輯清單
有沒有更好的方法來做到這一點?
如果您想要索引的結果,通常以索引開始是有用的。
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)
val result = (a zip b).zipWithIndex.flatMap {
case ((aItem, bItem), index) => if(aItem == bItem) Option(index) else None
}
a zip b
將返回從具有在B A匹配對所有元素。 例如,如果a較長(如在您的示例中),則結果將爲List((1,1),(1,0),(1,3),(0,2))
(該列表將爲b.length long)。
然後你也需要索引,那就是zipWithIndex
。
由於您只需要索引,因此會返回Option[Int]
並將其平坦化。
我可能會使用收集,以避免選項,但我的答案會類似於這個 – pedrorijo91
您可以使用索引for
此:
for{ i <- 0 to b.length-1
if (a contains b(i))
} yield i
scala> for(x <- b.indices.filter(a contains b(_))) yield x;
res27: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 3)
這裏是另一種選擇:
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
,然後獲取這些元素的索引將無法正常工作,除非在a
中包含b
中的所有元素是唯一的,indexOf
返回第一個元素的索引。只是站起來。
感謝您的回覆。但我現在糾正了這個問題。 – sowmiyaksr
這個答案更優雅IMO。 –
我得到,ArrayIndexOutOfBoundException使用此沒有任何修改。 – sowmiyaksr