web-dev-qa-db-ja.com

Swiftで配列を連結またはマージする方法を教えてください。

このようにSwiftで作成された2つの配列があるとします。

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

どうやってそれらを[1, 2, 3, 4, 5, 6]にマージすることができますか?

347
Hristo

+を使って配列を連結し、新しい配列を作ることができます。

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]
613
Martin R

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


#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サンプルコードは、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]

#4。 SequenceflatMap(_:)メソッドを使って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]

#5。 Sequencejoined()メソッドとArrayinit(_:)イニシャライザを使って、2つの配列を新しい配列にマージします。

SwiftはSequenceプロトコル(Arrayを含む)に準拠するすべての型に対してjoined()メソッドを提供します。 joined()は次の 宣言 を持っています。

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

func joined() -> FlattenSequence<Self>

その上、Swift Arrayinit(_:)イニシャライザを持っています。 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]

#6。 Arrayreduce(_:_:)メソッドを使って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]
100
Imanou Petit

もしあなたが演算子のオーバーロードが大好きではない、あるいは単なる関数型ではないのであれば:

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

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())
20
Tomasz Bąk

可能な選択肢のリストを完成するために、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() 
9

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]

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

3
Xinyang Li

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

スイフト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
Stotch

これが2つの配列をマージする最短の方法です。

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

それらを連結/結合する

array1 += array2
New value of array1 is [1,2,3,4,5,6]
2
handiansom
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のすべての要素を追加します。

ありがとう。

2
meMadhav

異なるデータ型のマージ配列

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

出力:

["a", true, 3, "b", "hi", 3, [6]]
0
Abhishek Gupta

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

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を追加することができます。

0
Jeremy Andrews