このようにSwiftで作成された2つの配列があるとします。
var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
どうやってそれらを[1, 2, 3, 4, 5, 6]
にマージすることができますか?
+
を使って配列を連結し、新しい配列を作ることができます。
let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
または+=
(またはappend
)を使用して一方の配列を他方の配列に追加します。
a += b
// Or:
a.append(contentsOf: b) // Swift 3
a.appendContentsOf(b) // Swift 2
a.extend(b) // Swift 1.2
print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
Swift 5では、必要に応じて、2つの配列を連結/マージするために、 6つの次の方法 のいずれかを選択できます。
Array
の+(_:_:)
ジェネリック演算子を使って2つの配列を新しい配列にマージするArray
は+(_:_:)
ジェネリック演算子を持ちます。 +(_:_:)
は次の 宣言 を持っています。
コレクションの要素とシーケンスを連結して新しいコレクションを作成します。
static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element
次のPlaygroundサンプルコードは、+(_:_:)
ジェネリック演算子を使用して、[Int]
型の2つの配列を新しい配列にマージする方法を示しています。
let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let flattenArray = array1 + array2
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Array
の+=(_:_:)
ジェネリック演算子を使って、配列の要素を既存の配列に追加するArray
は+=(_:_:)
ジェネリック演算子を持ちます。 +=(_:_:)
は次の 宣言 を持っています。
シーケンスの要素を範囲置換可能なコレクションに追加します。
static func += <Other>(lhs: inout Array<Element>, rhs: Other) where Other : Sequence, Self.Element == Other.Element
次のPlaygroundサンプルコードは、+=(_:_:)
総称演算子を使用して、[Int]
型の配列の要素を既存の配列に追加する方法を示しています。
var array1 = [1, 2, 3]
let array2 = [4, 5, 6]
array1 += array2
print(array1) // prints [1, 2, 3, 4, 5, 6]
Array
のappend(contentsOf:)
メソッドを使って別の配列に配列を追加するSwift Array
にはappend(contentsOf:)
メソッドがあります。 append(contentsOf:)
は次の 宣言 を持っています。
シーケンスまたはコレクションの要素をこのコレクションの末尾に追加します。
mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element
次のPlaygroundサンプルコードは、append(contentsOf:)
メソッドを使用して、配列を[Int]
型の別の配列に追加する方法を示しています。
var array1 = [1, 2, 3]
let array2 = [4, 5, 6]
array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]
Sequence
のflatMap(_:)
メソッドを使って2つの配列を新しい配列にマージするSwiftはSequence
プロトコル(Array
を含む)に準拠するすべての型に対してflatMap(_:)
メソッドを提供します。 flatMap(_:)
は次の 宣言 を持っています。
このシーケンスの各要素を使用して、指定された変換を呼び出した結果を連結したものを含む配列を返します。
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
次のPlaygroundサンプルコードは、flatMap(_:)
メソッドを使用して[Int]
型の2つの配列を新しい配列にマージする方法を示しています。
let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in
return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Sequence
のjoined()
メソッドとArray
のinit(_:)
イニシャライザを使って、2つの配列を新しい配列にマージします。SwiftはSequence
プロトコル(Array
を含む)に準拠するすべての型に対してjoined()
メソッドを提供します。 joined()
は次の 宣言 を持っています。
このシーケンスのシーケンスの要素を連結して返します。
func joined() -> FlattenSequence<Self>
その上、Swift Array
はinit(_:)
イニシャライザを持っています。 init(_:)
は次の 宣言 を持っています。
シーケンスの要素を含む配列を作成します。
init<S>(_ s: S) where Element == S.Element, S : Sequence
したがって、次のPlaygroundサンプルコードは、joined()
メソッドとinit(_:)
イニシャライザを使用して、[Int]
型の2つの配列を新しい配列にマージする方法を示しています。
let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array<Int>]>
let flattenArray = Array(flattenCollection)
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Array
のreduce(_:_:)
メソッドを使って2つの配列を新しい配列にマージするSwift Array
にはreduce(_:_:)
メソッドがあります。 reduce(_:_:)
は次の 宣言 を持っています。
与えられたクロージャを使ってシーケンスの要素を組み合わせた結果を返します。
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
次のPlaygroundコードは、reduce(_:_:)
メソッドを使用して[Int]
型の2つの配列を新しい配列にマージする方法を示しています。
let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in
return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
もしあなたが演算子のオーバーロードが大好きではない、あるいは単なる関数型ではないのであれば:
// use flatMap
let result = [
["merge", "me"],
["We", "shall", "unite"],
["magic"]
].flatMap { $0 }
// Output: ["merge", "me", "We", "shall", "unite", "magic"]
// ... or reduce
[[1],[2],[3]].reduce([], +)
// Output: [1, 2, 3]
Swift 2.0以降の私のお気に入りの方法は flatten
var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
let c = [a, b].flatten()
これはFlattenBidirectionalCollection
を返すので、もしあなたがCollectionType
が欲しいのであればこれで十分であり、あなたは無料で遅延評価を得るでしょう。正確に配列が必要な場合は、これを実行できます。
let c = Array([a, b].flatten())
可能な選択肢のリストを完成するために、reduce
を使って flatten の振る舞いを実装することができます。
var a = ["a", "b", "c"]
var b = ["d", "e", "f"]
let res = [a, b].reduce([],combine:+)
提示されたものの中で最良の代替案(パフォーマンス/メモリに関する)は単にflatten
です。これは新しい配列構造を作成せずに元の配列を遅延的にラップするだけです。
しかし、 flatten が LazyColletion
を返さないことに注意してください。そのため、遅延動作はチェーンに沿った次の操作(map、flatMap、filterなど)には伝播されません。
あなたの特定のケースで怠惰が意味を成すのであれば、flatten()
に.lazy
を前に付けるか追加することを忘れないでください、例えばTomaszサンプルをこのように修正する:
let c = [a, b].lazy.flatten()
Swift 3.0
加算演算子(+
)を使用して、互換性のある型を持つ2つの既存の配列を加算することによって、新しい配列を作成できます。新しい配列の型は一緒に追加した2つの配列の型から推測されます。
let arr0 = Array(repeating: 1, count: 3) // [1, 1, 1]
let arr1 = Array(repeating: 2, count: 6)//[2, 2, 2, 2, 2, 2]
let arr2 = arr0 + arr1 //[1, 1, 1, 2, 2, 2, 2, 2, 2]
これは上記のコードの正しい結果です。
特定のインデックスの後に2番目の配列を挿入したい場合は、これを実行できます(Swift 2.2以降)。
let index = 1
if 0 ... a.count ~= index {
a[index..<index] = b[0..<b.count]
}
print(a) // [1.0, 4.0, 5.0, 6.0, 2.0, 3.0]
スイフト4.X
私が知っている最も簡単な方法は、単に+記号を使うことです。
var Array1 = ["Item 1", "Item 2"]
var Array2 = ["Thing 1", "Thing 2"]
var Array3 = Array1 + Array2
// Array 3 will just be them combined :)
これが2つの配列をマージする最短の方法です。
var array1 = [1,2,3]
let array2 = [4,5,6]
それらを連結/結合する
array1 += array2
New value of array1 is [1,2,3,4,5,6]
var arrayOne = [1,2,3]
var arrayTwo = [4,5,6]
結果が欲しい場合:[1,2,3、[4,5,6]]
arrayOne.append(arrayTwo)
上記のコードは、arrayOneを単一の要素として変換し、それをarrayTwoの末尾に追加します。
[1、2、3、4、5、6]のように結果が欲しいのなら、
arrayOne.append(contentsOf: arrayTwo)
上記のコードは、arrayTwoの最後にarrayOneのすべての要素を追加します。
ありがとう。
異なるデータ型のマージ配列
var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)
出力:
["a", true, 3, "b", "hi", 3, [6]]
同様に、配列の辞書を使えば、次のことができます。
var dict1 = [String:[Int]]()
var dict2 = [String:[Int]]()
dict1["key"] = [1,2,3]
dict2["key"] = [4,5,6]
dict1["key"] = dict1["key"]! + dict2["key"]!
print(dict1["key"]!)
"key"が一致すれば、dict1を繰り返してdict2を追加することができます。