Scala:查找两个列表之间的差异

Scala:查找两个列表之间的差异,scala,Scala,假设我有两个列表: var l1 = List(1,0,0) and var l2 = List(0,0,1) 现在,我只使用map、reduce和filter函数,试图找出这两个列表之间的差异。另外,当我说差异时,我的意思是我想比较列表中的相同点。例如,将l1(0)与l2(0)进行比较,l1(1)与l2(1)进行比较,等等。在对所有内容进行比较之后,我返回一个数字,该数字表示两个列表之间不同元素的数量。我将如何做到这一点?正如@Andrey所建议的那样,简单明了 l1.zip(l2).cou

假设我有两个列表:

var l1 = List(1,0,0) and var l2 = List(0,0,1)

现在,我只使用
map
reduce
filter
函数,试图找出这两个列表之间的差异。另外,当我说差异时,我的意思是我想比较列表中的相同点。例如,将
l1(0)
l2(0)
进行比较,
l1(1)
l2(1)
进行比较,等等。在对所有内容进行比较之后,我返回一个数字,该数字表示两个列表之间不同元素的数量。我将如何做到这一点?

正如@Andrey所建议的那样,简单明了

l1.zip(l2).count(t2 => t2._1 != t2._2)

正如@Andrey所说的那样,简单明了

l1.zip(l2).count(t2 => t2._1 != t2._2)

如果允许
长度

(0 until l1.length).filter { i => l1(i) != l2(i) }.length
如果不是(严格来说,将
.length
替换为
.map(=>1)。减少(+41;
):

后者将在空列表上失败。如果允许
reduceOption
,则可以这样做:

(0 until l1.length).map { i => if (l1(i) == l2(i)) 0 else 1 }
                   .reduceOption(_ + _).getOrElse(0)

在这两种情况下,您可能希望使用
Vector
而不是
List
,因为
List
索引速度很慢。当然,
zip
比索引更惯用,如果允许
length
的话,在
List

上也会更快:

(0 until l1.length).filter { i => l1(i) != l2(i) }.length
val elem= l1.zip(l2).filter(_.1 != _.2).length
如果不是(严格来说,将
.length
替换为
.map(=>1)。减少(+41;
):

后者将在空列表上失败。如果允许
reduceOption
,则可以这样做:

(0 until l1.length).map { i => if (l1(i) == l2(i)) 0 else 1 }
                   .reduceOption(_ + _).getOrElse(0)
在这两种情况下,您可能希望使用
Vector
而不是
List
,因为
List
索引速度很慢。当然,
zip
比索引更惯用,甚至在
列表中也会更快

val elem= l1.zip(l2).filter(_.1 != _.2).length
这将达到目的


它会起作用。

为什么要对
映射
减少
过滤
进行奇怪的限制?为什么不
zip
?为什么你不能这样做?Set(l1)diff Set(l2)?@RamanMishra在
val l1=List(0,0,0,0,0)
val l2=List(1,1,1,1)
上试一试。这些集合有多少个元素?你怎么能从中得到5分呢?@Andreytukin我知道它会给你什么好。为什么对
map
reduce
filter
有奇怪的限制?为什么不
zip
?为什么你不能这样做?Set(l1)diff Set(l2)?@RamanMishra在
val l1=List(0,0,0,0,0)
val l2=List(1,1,1,1)
上试一试。这些集合有多少个元素?你如何从中得到5分?@Andreytukin我知道它会给出什么好。
t2
使整个表达式看起来不对称,因为
1
出现的次数与
2
不同。我更愿意将参数命名为
t
;)是的,你是对的,但我有一些“坏”习惯将tuple2定义为t2,tuple3定义为t3。。。为了便于阅读,@Andrey说了什么,甚至
{case(a,b)=>a!=b}
。不幸的是,
(l1,l2).zip.count(!=41;
不起作用。
t2
使整个表达式看起来不对称,因为
1
出现的次数与
2
不同。我更愿意将参数命名为
t
;)是的,你是对的,但我有一些“坏”习惯将tuple2定义为t2,tuple3定义为t3。。。为了便于阅读,@Andrey说了什么,甚至
{case(a,b)=>a!=b}
。不幸的是
(l1,l2).zipped.count(!=\u)
不起作用。@Andreytukin因此出现了第三个代码示例(我知道,我没有明确说明两个地方都需要使用reduceOption)。我很确定,如果没有
reduceOption
、递归、折叠或其他一些功能,就不可能正确处理空列表。@Andreytukin因此出现了第三个代码示例(我知道,我没有明确说明两个地方都需要使用reduceOption)。我敢肯定,如果没有
reduceOption
、递归、折叠或其他功能,就不可能正确处理空列表。