scala合併有序集合

2021-08-04 16:55:38 字數 4079 閱讀 6642

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...