problem
你想要把兩個集合合併為乙個集合,要麼包含兩集合所有的元素,要麼包含兩個集合的相同元素,要麼包含兩個集合的不同元素。
solution
對於這個問題有很多解決方案,用哪種取決於你的需要:
使用++=方法來合併集合到乙個mutable集合,比如arraybuffer
scala> val a = collection.mutable.arraybuffer(1
,2,3
)a: scala.collection.mutable.arraybuffer[int] = arraybuffer(1
, 2, 3
)scala> a ++= seq(4,5,6)
res15: a.type = arraybuffer(1
, 2, 3
, 4, 5
, 6)
使用++方法來合併兩個mutable或者immutable變數,併發返回的結果指定給乙個新的變數
scala> val a = array
(1,2,3)
a: array
[int] = array
(1, 2
, 3)
scala> val b = array
(4,5,6)
b: array
[int] = array
(4, 5
, 6)
scala> val c = a ++ b
c: array
[int] = array
(1, 2
, 3, 4
, 5, 6
)
你同樣可以使用union和intersect方法來合併兩個集合:
scala> val a = array
(1,2
,3,4,5)
a: array
[int] = array
(1, 2
, 3, 4
, 5)
scala> val b = array
(4,5
,6,7,8)
b: array
[int] = array
(4, 5
, 6, 7
, 8)
scala> val c = a.intersect(b)
c: array
[int] = array
(4, 5
)scala> a union b
res16: array
[int] = array
(1, 2
, 3, 4
, 5, 4
, 5, 6
, 7, 8
)scala> a.union(b).distinct
res17: array
[int] = array
(1, 2
, 3, 4
, 5, 6
, 7, 8
)
diff方法的返回結果取決於哪個集合被呼叫
scala> a.diff(b)
res19: array
[int] = array
(1, 2
, 3)
scala> b.diff(a)
res20: array
[int] = array
(6, 7
, 8)
scaladoc對diff方法返回值的說明,「乙個新的集合,包含被呼叫集合的所有不在引數集合中出現的元素。如果乙個元素在被調集合中出現了n次,在引數集合中出現了m次,那麼這個元素會在結果集合中出現n-m(如果n-m<=0那麼為0)次。"
scala> val a = array
(1,2
,3,4
)a: array
[int] = array
(1, 2
, 3, 4
)scala> val b = array
(4,5
,6,7
)b: array
[int] = array
(4, 5
, 6, 7
)scala> array
.concat(a,b)
res27: array
[int] = array
(1, 2
, 3, 4
, 4, 5
, 6, 7
)
你還可以使用:::來連線兩個list的元素:
scala> val a = list
(1,2
,3,4
)a: list
[int] = list
(1, 2
, 3, 4
)scala> val b = list
(4,5
,6,7
)b: list
[int] = list
(4, 5
, 6, 7
)scala> val c = a ::: b
c: list
[int] = list
(1, 2
, 3, 4
, 4, 5
, 6, 7
)
discussion
接下來我們需要找到在乙個集合中而不在另乙個集合中的所有元素,先把集合轉化為乙個set,然後再呼叫diff方法來對比兩個set:
scala> val a = array
(1,2
,3,11
,4,12
,4,5
)a: array
[int] = array
(1, 2
, 3, 11
, 4, 12
, 4, 5
)scala> val b = array
(6,7
,4,5
)b: array
[int] = array
(6, 7
, 4, 5
)scala> val c = a.toset diff b.toset
c: scala.collection.immutable.set[int] = set
(1, 2
, 12
, 3, 11
)scala> val d = b.toset diff a.toset
d: scala.collection.immutable.set[int] = set
(6, 7
)
接下來我們合併兩個新集合,新集合元素即為在集合a中,也在集合b中,但是不同時存在於集合a,b中。因為diff作用在set上,會返回乙個新的set包含在被調集合中而不在傳入集合中的元素,並且set中元素都是唯一的。
scala> val
complement = c ++ d
complement: scala.collection.immutable.set[int
] = set(1
, 6, 2
, 12
, 7, 3
, 11
)
我們還可以通過減去集合的交集來達到同樣的效果:
scala> val i = a.intersect
(b)i: array[int
] = array(4
, 5)
scala> val c = a.toset - i.toset
c: scala.collection.immutable
.set[any
] = set(5
, 1, 2
, 12
, 3, 11
, 4)
scala> val d = b.toset - i.toset
d: scala.collection.immutable
.set[any
] = set(6
, 7, 4
, 5)
合併有序陣列
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 給你兩個有序且公升序的陣列,請你把它們合成乙個公升序陣列並輸出 give you two ordered ascending array,you put them into one ascending array and ou...
合併有序陣列
描述 給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。...
合併有序陣列
給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。vo...