আমি কীভাবে সুইফটে অ্যারেগুলিকে একত্রিত করতে বা মার্জ করব?


396

যদি এখানে দুটি দ্রুত অ্যারে তৈরি করা হয়:

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

এগুলি কীভাবে একীভূত করা যায় [1, 2, 3, 4, 5, 6]?


এই একটি উপসেট হয় stackoverflow.com/q/24465281/78336
neoneye

উত্তর:


691

আপনি +একটি নতুন অ্যারে তৈরি করে অ্যারেগুলি সংহত করতে পারেন

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]

[AnyObect]? সিজিফ্লোয়েটের সাথে অভিন্ন নয়। যেকোনওবজেক্ট অ্যারেগুলিতে সংযোগ দেওয়ার সময়।
খুনশান

6
খুনশান: AnyObjectএকটি বস্তু নির্দেশ করে, যা আমি বুঝতে পেরেছি এমন একটি অর্থ যা শ্রেণীর ধরণ থেকে ইনস্ট্যান্ট হয়। CGFloatএটি কোনও বস্তু নয়, এটি একটি স্কেলারের মান। আমি এটি যেমন বুঝতে পারি, অ্যারেতে স্কেলার থাকতে পারে, যদি না এটি সংযুক্ত হিসাবে সংজ্ঞায়িত হয় AnyObjectবা আরও পরিমার্জনযোগ্য হয়। তবে আমার সন্দেহ হয় এখানে সমস্যাটি হ'ল অ্যারেটি একটি alচ্ছিকভাবে আবৃত থাকে, সুতরাং আপনাকে এটি দিয়ে !বা ?প্রথমে মোড়ক করতে হবে ।
গডফ্রে ওভেন

আমরা কী জানি যে সুইফট 2-র অনুলিপি-অন-লেখার বুদ্ধি bঅংশটি aসংশোধিত হয়েছে কিনা তা নির্ধারণের ক্ষেত্রে প্রসারিত (তাই সম্ভবত কোনও অনুলিপি bসময়কালে a.appendContentsOf(b))?
এফেমেরা

1
ওভেনগোডফ্রে ধন্যবাদ আমি appendContentsOf এবং insertContentsOf নিয়ে লিল বিভ্রান্তি পেয়েছি।
খুনশান


137

আপনার প্রয়োজন অনুসারে সুইফট 5 এর সাথে, আপনি দুটি অ্যারে সংযুক্তকরণ / একত্রিত করার জন্য নিম্নলিখিত ছয়টি উপায়ের মধ্যে একটি চয়ন করতে পারেন ।


# 1। Arrayএর +(_:_:)জেনেরিক অপারেটরের সাথে একটি নতুন অ্যারেতে দুটি অ্যারে মার্জ করুন

Arrayএকটি +(_:_:)জেনেরিক অপারেটর আছে। +(_:_:)নিম্নলিখিত ঘোষণা আছে :

সংগ্রহের উপাদান এবং ক্রমগুলির উপাদানগুলি যুক্ত করে একটি নতুন সংগ্রহ তৈরি করে।

static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element

নিম্নলিখিত খেলার মাঠের নমুনা কোডটি দেখায় যে কীভাবে জেনেরিক অপারেটর [Int]ব্যবহার করে টাইপের দুটি অ্যারে এক নতুন অ্যারেতে মার্জ করা যায় +(_:_:):

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

নিম্নলিখিত খেলার মাঠের নমুনা কোডটি দেখায় কীভাবে জেনেরিক অপারেটর [Int]ব্যবহার করে টাইপের একটি অ্যারের উপাদানগুলি বিদ্যমান অ্যারেতে যুক্ত করতে হয় +=(_:_:):

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

array1 += array2
print(array1) // prints [1, 2, 3, 4, 5, 6]

# 3। Arrayএর append(contentsOf:)পদ্ধতির সাহায্যে একটি অ্যারে অন্য অ্যারেতে যুক্ত করুন

সুইফট Arrayএকটি append(contentsOf:)পদ্ধতি আছে। append(contentsOf:)নিম্নলিখিত ঘোষণা আছে :

এই সংগ্রহের শেষে একটি ক্রম বা সংগ্রহের উপাদান যুক্ত করে।

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

নিম্নলিখিত খেলার মাঠের নমুনা কোডটি পদ্ধতি [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। Sequenceএর flatMap(_:)পদ্ধতিতে একটি নতুন অ্যারেতে দুটি অ্যারে মার্জ করুন

প্রোটোকলের flatMap(_:)সাথে সামঞ্জস্যপূর্ণ Sequence(সহ Array) সমস্ত ধরণের জন্য সুইফট একটি পদ্ধতি সরবরাহ করে । flatMap(_:)নিম্নলিখিত ঘোষণা আছে :

এই অনুক্রমের প্রতিটি উপাদান দিয়ে প্রদত্ত রূপান্তর কল করার সংক্ষিপ্ত ফলাফল সম্বলিত একটি অ্যারে প্রদান করে।

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

নিম্নলিখিত খেলার মাঠের নমুনা কোডটি পদ্ধতি [Int]ব্যবহার করে কীভাবে দুটি অ্যারেগুলিকে নতুন অ্যারেতে মার্জ করা যায় তা দেখায় flatMap(_:):

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। Sequenceএর joined()পদ্ধতি এবং Arrayএর init(_:)ইনিশিয়ালাইজারের সাহায্যে দুটি অ্যারে নতুন অ্যারেতে মার্জ করুন

প্রোটোকলের joined()সাথে সামঞ্জস্যপূর্ণ Sequence(সহ Array) সমস্ত ধরণের জন্য সুইফট একটি পদ্ধতি সরবরাহ করে । joined()নিম্নলিখিত ঘোষণা আছে :

এই সিকোয়েন্সের ক্রমগুলির উপাদানগুলি সংঘবদ্ধ করে ফেরত দেয়।

func joined() -> FlattenSequence<Self>

এছাড়া সুইফটের Arrayএকটি init(_:)ইনিশিয়ালাইজার রয়েছে। init(_:)নিম্নলিখিত ঘোষণা আছে :

একটি অনুক্রমের উপাদানগুলি সহ একটি অ্যারে তৈরি করে।

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

অতএব, নিম্নলিখিত খেলার মাঠের নমুনা কোডটি পদ্ধতি এবং ইনিশিয়ালাইজার [Int]ব্যবহার করে কীভাবে দুটি অ্যারেটিকে নতুন অ্যারেতে মার্জ করতে হবে তা দেখায় :joined()init(_:)

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। Arrayএর reduce(_:_:)পদ্ধতিতে একটি নতুন অ্যারেতে দুটি অ্যারে মার্জ করুন

সুইফট Arrayএকটি reduce(_:_:)পদ্ধতি আছে। reduce(_:_:)নিম্নলিখিত ঘোষণা আছে :

প্রদত্ত বন্ধটি ব্যবহার করে ক্রমের উপাদানগুলিকে একত্রিত করার ফলাফল প্রদান করে।

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

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে পদ্ধতিটি [Int]ব্যবহার করে কীভাবে দুটি অ্যারে এক নতুন অ্যারেতে মার্জ করা যায় reduce(_:_:):

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
এই কোডটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, ভাল ব্যাখ্যা, আপনার উত্তরের জন্য কেবল অ্যাডিশন, এটি সবচেয়ে ভাল হবে, যদি আপনি বলেন যে কোনটি অভিনয় দ্বারা আরও দক্ষ?
কোকেমোমেকে

আমি +2 অ্যারে এবং joined()অ্যারের অ্যারের জন্য পছন্দ করি ।
সিউর

যদি আপনি 2 টিরও বেশি অ্যারে (বা স্ট্রিং বা অন্য যে কোনও কিছু) মার্জ করে থাকেন তবে +অপারেটরটি ব্যবহার করা থেকে নিজেকে বিরত রাখুন , এটি একেবারে উন্মাদ সংকলনের সময় উত্পন্ন করে।
লিকিউ

@ লাভিকো আপনি কোন পদ্ধতির সুপারিশ করবেন?
সাইবারমিউ

@ সাইবারমিউ যে কোনও কিছু যা ওভারলোডেড অপারেটর ব্যবহার করে না, আমি পদ্ধতিটি # 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

সুইফট ২.০ থেকে আমার প্রিয় পদ্ধতিটি সমতল

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()
Cœur

13

সম্ভাব্য বিকল্পগুলির তালিকাটি সম্পূর্ণ করতে reduce, ফ্ল্যাটনের আচরণ বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে :

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

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

উপস্থাপিতগুলির মধ্যে সেরা বিকল্প (পারফরম্যান্স / স্মৃতি অনুসারে) হ'ল সহজভাবে flatten, যে কোনও নতুন অ্যারে কাঠামো তৈরি না করেই অলসভাবে মূল অ্যারেগুলি আবৃত করে।

কিন্তু লক্ষ্য করা যে চেপ্টা ফেরত দেয় না একটি LazyCollection, যাতে অলস আচরণের শৃঙ্খল (মানচিত্র, flatMap, ফিল্টার, ইত্যাদি ...) বরাবর পরবর্তী অপারেশনে প্রচারিত করা হবে না।

Lazyness আপনার নির্দিষ্ট ক্ষেত্রে জ্ঞান করে তোলে, তাহলে শুধু শুরুতে যোগ মনে রাখবেন বা সংযোজন .lazyকরতে flatten(), উদাহরণস্বরূপ, পরিবর্তন Tomasz নমুনা এই ভাবে:

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

এই উত্তরটি 2019 সালে সুইফ্ট 5.1 সহ এখনও কতটা ভাল?
উইলব্যাটেল

সমতল () এর অস্তিত্ব নেই। যোগদান করা () ফ্ল্যাট () এর পরিবর্তে ব্যবহার করা যেতে পারে
প্রণব প্রব্যাকার

4

যদি আপনি চান যে কোনও নির্দিষ্ট সূচকের পরে দ্বিতীয় অ্যারেটি সন্নিবেশ করানো হয় তবে আপনি এটি করতে পারেন (সুইফট ২.২ অনুযায়ী):

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

সুইফট 3.0

সংযোজন অপারেটর ( +) এর সাথে সামঞ্জস্যপূর্ণ প্রকারের সাথে দুটি বিদ্যমান অ্যারে যোগ করে আপনি একটি নতুন অ্যারে তৈরি করতে পারেন । নতুন অ্যারের ধরণটি আপনি যে দুটি অ্যারে একসাথে যুক্ত করেছেন তা থেকে অনুমান করা হয়,

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)

উপরের কোডটি অ্যারেঅনকে একক উপাদান হিসাবে রূপান্তর করবে এবং অ্যারেটুইয়ের শেষে যুক্ত করবে।

আপনি যদি ফলাফল হিসাবে চান: [1, 2, 3, 4, 5, 6] তবে,

arrayOne.append(contentsOf: arrayTwo)

উপরের কোডটি অ্যারে টু এর শেষে অ্যারেঅন এর সমস্ত উপাদান যুক্ত করবে।

ধন্যবাদ।


4

সুইফট 4. এক্স

আমার জানা সবচেয়ে সহজ উপায় হ'ল + চিহ্নটি ব্যবহার করা

var Array1 = ["Item 1", "Item 2"]
var Array2 = ["Thing 1", "Thing 2"]

var Array3 = Array1 + Array2

// Array 3 will just be them combined :)

3

দুটি অ্যারে একত্রে সংক্ষিপ্ততম উপায়।

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

এবং "1" কী মিললে আপনি ডেট 1 এর মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং ডিক 2 যোগ করতে পারেন


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.