2016-11-29 57 views
0

我有一个包含Int的Arraybuffer。除此之外,我还有一个包含Int的Queue。我想从我的Arraybuffer中移除队列中也存在的所有Int。什么是有效的方式来做到这一点。我可以使用过滤功能的东西,如:基于队列的Scala Filter ArrayBuffer

newArray = Arraybuffer.filter(_ not in Queue) 

回答

2

我会使用一个Set[A],特别是如果你ArrayBuffer[Int]足够大:

val queue = Queue[Int] = ??? 
val arrayBuffer: ArrayBuffer[Int] = ??? 

val set = queue.toSet 

val filteredBuffer = arrayBuffer.filterNot(set.contains) 
+0

集的应用方法调用包含了你,所以你可以调用'filterNot(套)' – soote

+0

@soote没错,但我认为'set.contains'传达的OP更好的意图。简洁并不总是一个必要的特征。 –

1

是的,你可以:

val q: Queue[Int] = ??? 
val a: ArrayBuffer[Int] = ??? 

a.filter(!q.contains(_)) 
2

如果您的数组缓冲区包含唯一整数(我们可以通过将其转换为一个集合来强制执行此操作),那么diff函数就是您想要的。

val queue: Queue[Int] = Queue(1,2,3) 
val array: ArrayBuffer[Int] = ArrayBuffer(1,2,3,4,5,6) 

array.toSet.diff(queue) // ArrayBuffer(4,5,6) 
+0

值得注意的是,如果有多个相同的值,则此方法将只删除队列中存在的许多值。如果你有'Queue(1,1,2,3)'和'ArrayBuffer(1,1,1,2,3,4)'结果将是'ArrayBuffer(1,4)'使用'filter'和'包含'将在队列中出现时删除所有出现的相同值。所以这取决于期望的结果 – puhlen