Scala两个列表的区别

Pav*_*utt 31 scala list

我有两个清单:

val list1 = List("word1","word2","word2","word3","word1")
val list2 = List("word1","word4")
Run Code Online (Sandbox Code Playgroud)

我想删除所有出现的list2元素list1,即我想要的

List("word2","word2","word3") <= list1 *minus* list2
Run Code Online (Sandbox Code Playgroud)

我这样做list1 diff list2List("word2","word2","word3","word1"),它只删除了第一次出现的"word1".

我无法将其转换为集合,因为我需要有关重复的知识(请参阅上面的"word2").该怎么办?

Rex*_*err 61

您可以

val unwanted = list2.toSet
list1.filterNot(unwanted)
Run Code Online (Sandbox Code Playgroud)

删除所有项目list2.(您不需要重复知识list2.)

  • 对于那些想知道它如何工作的人(因为`filterNot`接受一个谓词),请注意`Set`类有`apply(elem:A):Boolean`,它检查集合中是否存在元素. (19认同)
  • 我认为他只是意味着"不需要的" - 你在结果列表中不想要的项目. (3认同)

cmb*_*ter 8

你可以试试这个:

val list1 = List("word1","word2","word2","word3","word1")
val list2 = List("word1","word4")

println(list1.filterNot(list2.contains(_)))
Run Code Online (Sandbox Code Playgroud)

  • list2上的contains操作效率很低 - 它会对list1的每个元素进行线性扫描,因此内部循环中有nxm次迭代.对于任何非平凡集合,集合包含测试优于列表,因为它首先使用哈希码比较来消除大多数情况,并且仅在少数剩余情况下测试字符串相等性(如果有的话).(这有多好取决于使用的散列算法). (3认同)

小智 8

val list1 = List("word1","word2","word2","word3","word1")
val list2 = List("word1","word4") 
list1 diff list2
Run Code Online (Sandbox Code Playgroud)

这将做到。