2016-11-29 61 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