Swiftで配列を連結またはマージするにはどうすればよいですか?


回答:


691

で配列を連結して+、新しい配列を作成できます

let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

または+=(またはappend)で1つの配列を他の配列に追加します:

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]

[AnyObect]?CGFloatと同じではありません。AnyObject配列に連結している間。
khunshan 2014年

6
Khunshan:AnyObjectオブジェクトを示します。私が理解しているように、これはクラス型からインスタンス化されたものを意味します。CGFloatはオブジェクトではなく、スカラー値です。私が理解しているように、配列はスカラーを含むことができますAnyObject。しかし、ここでは問題は配列がオプションでラップされているためだと思います。そのため!?最初にまたはで展開する必要があります。
Owen Godfrey

私たちは、スウィフト2のコピー・オン・ライト・インテリジェンスのかどうかを判断するまで拡張するかどうかを知っていますbの一部a変更されたが(したがって、おそらくのコピーeliding b中のa.appendContentsOf(b))?
Ephemera

1
@OwenGodfreyありがとう。appendContentsOfとinsertContentsOfについて、ちょっと混乱しています。
クンシャン2016年


137

Swift 5では、必要に応じて、6つの方法のいずれかを選択して、2つの配列を連結/マージできます。


#1。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]

#2。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]

#3。Arrayappend(contentsOf:)メソッドで配列を別の配列に追加する

Swift Arrayにはappend(contentsOf:)メソッドがあります。append(contentsOf:)次の宣言があります:

シーケンスまたはコレクションの要素をこのコレクションの最後に追加します。

mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element

次のPlaygroundサンプルコードは、メソッド[Int]を使用して配列をタイプの別の配列に追加する方法を示していますappend(contentsOf:)

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]

#4。SequenceflatMap(_:)メソッドで2つの配列を新しい配列にマージします

Swiftは、プロトコル(を含む)にflatMap(_:)準拠するすべてのタイプのメソッドを提供しSequenceますArrayflatMap(_:)次の宣言があります:

このシーケンスの各要素で指定された変換を呼び出した結果を連結した配列を返します。

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

次のPlaygroundサンプルコードは[Int]flatMap(_:)メソッドを使用して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]

#5。新規の配列に二つの配列をマージSequencejoined()方法とArrayinit(_:)イニシャライザ

Swiftは、プロトコル(を含む)にjoined()準拠するすべてのタイプのメソッドを提供しSequenceますArrayjoined()次の宣言があります:

このシーケンスのシーケンスの要素を連結して返します。

func joined() -> FlattenSequence<Self>

また、Swift Arrayにはinit(_:)イニシャライザがあります。init(_:)次の宣言があります:

シーケンスの要素を含む配列を作成します。

init<S>(_ s: S) where Element == S.Element, S : Sequence

したがって、次のPlaygroundサンプルコードは[Int]joined()メソッドとinit(_:)初期化子を使用して、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]

#6。Arrayreduce(_:_:)メソッドで2つの配列を新しい配列にマージします

Swift Arrayにはreduce(_:_:)メソッドがあります。reduce(_:_:)次の宣言があります:

指定されたクロージャを使用してシーケンスの要素を組み合わせた結果を返します。

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

次のPlaygroundコードは[Int]reduce(_:_:)メソッドを使用して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]

5
このコードを共有してくれてありがとう、良い説明、あなたの答えに加えて、パフォーマンスによってどちらがより効率的であるかを言うのが最善でしょうか?
こけもむけ2017年

+2つの配列と配列の配列が好きですjoined()
・クール

3つ以上の配列(または文字列など)をマージする場合は、+演算子を使用しないようにしてください。コンパイル時間が非常に狂います。
lawicko

@lawickoどの方法をお勧めしますか?
Cyber​​Mew

@Cyber​​Mewオーバーロードされた演算子を使用しないものは何でも、最も読みやすいと思うのでメソッド#3が好きですが、フラットマップのメソッド#4も好きです。文字列の場合、最後に結合された文字列をすぐに取得できるので、方法5が好きです。
lawicko

34

オペレーターのオーバーロードの大ファンではない場合、または関数型の多くのファンではない場合:

// 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]

22

スウィフト2.0以来、私のお気に入りの方法はされて平らに

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())

2
flatten()今日ではもう存在しないようです。しかし、あなたは考慮するかもしれませんjoined()
クール

13

可能な選択肢のリストを完成reduceさせるために、flattenの動作を実装するために使用できます:

var a = ["a", "b", "c"] 
var b = ["d", "e", "f"]

let res = [a, b].reduce([],combine:+)

提示されたものの中で最良の代替案(パフォーマンス/メモリに関して)は、単にflatten、新しい配列構造を作成せずに元の配列を遅延してラップするだけです。

しかし、ことを予告フラット化が 戻らないLazyCollection怠惰な行動が連鎖(マップ、flatMap、フィルタ、等...)に沿って次の動作に伝播されませんのでこと、。

特定のケースで遅延が理にかなっている場合は、toを先頭に追加または追加する.lazyことを忘れないでください。flatten()たとえば、Tomaszサンプルを次のように変更します。

let c = [a, b].lazy.flatten()

この回答は、2019年にSwift 5.1でどの程度うまく機能しますか?
willbattel

flatten()はもう存在しません。
join

4

特定のインデックスの後に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

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]

これは上記のコードの正しい結果です。


4
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のすべての要素を追加します。

ありがとう。


4

Swift 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 :)

3

2つの配列をマージする最も簡単な方法を次に示します。

 var array1 = [1,2,3]
 let array2 = [4,5,6]

それらを連結/マージする

array1 += array2
New value of array1 is [1,2,3,4,5,6]

1

同様に、配列の辞書を使用すると、次のことができます。

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"]!)

そして、「キー」が一致する場合、dict1を繰り返し、dict2を追加できます。


0

異なるデータ型であるマージ配列:

var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)

出力:

["a", true, 3, "b", "hi", 3, [6]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.