সুইফটে অ্যারের প্রথম 5 অবজেক্ট কীভাবে ফিরে আসবেন?


179

সুইফটে, অ্যারেতে উচ্চতর অর্ডার পদ্ধতিগুলি ব্যবহার করে 5 টি প্রথম অবজেক্ট ফেরত দেওয়ার জন্য কি চতুর উপায় আছে? এটি করার ইজেক্ট-সি উপায়টি একটি সূচক সংরক্ষণ করছিল, এবং অ্যারে ইনক্রিমেন্টিং সূচকটি 5 না হওয়া পর্যন্ত এবং নতুন অ্যারে ফিরে না আসা পর্যন্ত লুপ করে। এটি দিয়ে কোনও উপায় আছে filter, mapবা reduce?


আমার উত্তরটি সুইফট 4 এর জন্য দেখুন যা এ এর ​​প্রথম nউপাদানগুলি ফেরত দেওয়ার 6 টি বিভিন্ন উপায় দেখায় Array
ইমানো পেটিট

উত্তর:


445

এখন পর্যন্ত একটি সুইফ্ট অ্যারের প্রথম এন উপাদানগুলি পাওয়ার সবচেয়ে নিকটতম উপায়টি ব্যবহার করছে prefix(_ maxLength: Int):

let someArray = [1, 2, 3, 4, 5, 6, 7]
let first5 = someArray.prefix(5) // 1, 2, 3, 4, 5

এটি সীমানা নিরাপদ থাকার সুবিধা আছে। আপনি যে গণনাটি পাস করেছেন তা prefixযদি অ্যারে গণনার চেয়ে বড় হয় তবে এটি কেবল পুরো অ্যারেটি দেয়।

দ্রষ্টব্য: মতামতগুলিতে নির্দেশিত হিসাবে, Array.prefixআসলে একটি প্রদান করে ArraySlice, একটি নয় Array। বেশিরভাগ ক্ষেত্রে Arrayএটির কোনও পার্থক্য করা উচিত নয় তবে আপনাকে যদি ফলাফলটি কোনও টাইপের জন্য নির্ধারিত করতে বা কোনও Arrayপ্যারামের প্রত্যাশা করে এমন কোনও পদ্ধতিতে পাস করার প্রয়োজন হয় তবে আপনাকে ফলাফলটি একটি Arrayধরণের মধ্যে বাধ্য করতে হবে :let first5 = Array(someArray.prefix(5))


41
আইএমএইচও, এমন একটি খারাপ নামের পছন্দ পছন্দ করুন। এরে হয়েছে dropFirstএবং dropLast, তাই পাশাপাশি থাকতে পারে takeFirstএবং takeLast
মাজিয়ড

10
এছাড়াও যদি আপনাকে first5অ্যারে হওয়ার দরকার হয় তবে কেবল লিখুনlet first5 = Array(someArray.prefix(5))
ইউলাজডিনস

2
@ এম্লুইসব্রাউন দুঃখিত, আপনার সাথে একমত হতে পারে না :) video = video.prefix(5)এক্সকোডে আমার প্রকল্পে Cannot assign value of type 'ArraySlice<Video>' to type '[Video]'
.2.২


2
@ onmyway133 prefixসম্ভবত শুধুমাত্র সুইফট ২.x (আমার মনে নেই এটি 1.x এ ছিল কিনা) তবে এটি অবশ্যই কোনও ওএসে বিদ্যমান রয়েছে যা সুইফট ২.x সমর্থন করে যা আইওএস and এবং তারপরের উপরেরটি । সুইফট বৈশিষ্ট্য প্রাপ্যতা আইওএস সংস্করণ নয়, সুইফট প্রকাশ দ্বারা নির্ধারিত হয়।
mluisbrown

99

আপডেট:prefix অ্যারের প্রথম এন উপাদানগুলি পেতে এখন ব্যবহারের সম্ভাবনা রয়েছে । পরীক্ষা করে দেখুন @ mluisbrown এর উত্তর একটি ব্যাখ্যা কিভাবে উপসর্গ ব্যবহার করার জন্য।

মূল উত্তরঃ আপনি এটা সত্যিই সহজ ছাড়া করতে পারেন filter, mapবা reduceশুধু আপনার অ্যারের একটি সীমার ফিরে:

var wholeArray = [1, 2, 3, 4, 5, 6]
var n = 5

var firstFive = wholeArray[0..<n] // 1,2,3,4,5

71
আপনি যদি nএকটি সুইফ্ট অ্যারে থেকে প্রথম আইটেম চান তবে আপনি এটি করতে পারেন wholeArray.prefix(n)যা সীমাবদ্ধ থাকার অতিরিক্ত সুবিধা রয়েছে। যদি nঅ্যারের আকার চেয়ে বড় prefixআয় পুরো অ্যারে।
mluisbrown

4
এটির wholeArrayচেয়ে বেশি উপাদান না থাকলে এটি ক্রাশ হবেn
জ্যাক লিন

@ ক্র্যাশলোট আমি পুরোপুরি নিশ্চিত নই, তবে আমি মনে করি সেই সময় যেখানে আমি আমার উত্তর লিখেছি সেখানে এর মতো কিছুই ছিল না prefix
খ্রিস্টান

1
প্রথম 5 টি অবজেক্ট পেতে এই কোডটি ব্যবহার করুন ... এটি নিখুঁতভাবে কাজ করে [0,1,2,3,4,5]। গণিত ()। ফ্ল্যাটম্যাপ {$ 0 <5? $ 1: নীল}
মনিশ মহাজন

64

আপনার প্রয়োজন অনুসারে সুইফট 5 দিয়ে আপনার সমস্যা সমাধানের জন্য আপনি নীচের 6 টি খেলার মাঠের কোড বেছে নিতে পারেন ।


# 1। subscript(_:)সাবস্ক্রিপ্ট ব্যবহার করা

let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array[..<5]
//let arraySlice = array[0..<5] // also works
//let arraySlice = array[0...4] // also works
//let arraySlice = array[...4] // also works
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]

# 2। prefix(_:)পদ্ধতি ব্যবহার

জটিলতা: ও (1) যদি সংগ্রহটি মেনে চলে RandomAccessCollection; অন্যথায়, হে ( ), যেখানে উপাদানের সংখ্যা হল সংগ্রহে শুরু থেকে নির্বাচন করতে।

let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]

অ্যাপল এর জন্য বলেছে prefix(_:):

যদি সর্বাধিক দৈর্ঘ্য সংগ্রহের উপাদানগুলির সংখ্যা ছাড়িয়ে যায় তবে ফলাফলটি সংগ্রহে সমস্ত উপাদান থাকে।


# 3। prefix(upTo:)পদ্ধতি ব্যবহার

জটিলতা: ও (1)

let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(upTo: 5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]

অ্যাপল এর জন্য বলেছে prefix(upTo:):

prefix(upTo:)পদ্ধতিটি ব্যবহার করা সংগ্রহের সাবস্ক্রিপ্ট হিসাবে আংশিক অর্ধ-খোলা পরিসর ব্যবহারের সমতুল্য। সাবস্ক্রিপ্ট স্বরলিপি উপরে পছন্দ করা হয় prefix(upTo:)


# 4। prefix(through:)পদ্ধতি ব্যবহার

let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(through: 4)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]

# 5। removeSubrange(_:)পদ্ধতি ব্যবহার

জটিলতা: O ( n ), যেখানে n সংগ্রহের দৈর্ঘ্য।

var array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
array.removeSubrange(5...)
print(array) // prints: ["A", "B", "C", "D", "E"]

# 6। dropLast(_:)পদ্ধতি ব্যবহার

জটিলতা: ও (1) যদি সংগ্রহটি মেনে চলে RandomAccessCollection; অন্যথায়, ও ( কে ), যেখানে k হ'ল উপাদানগুলির সংখ্যা।

let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let distance = array.distance(from: 5, to: array.endIndex)
let arraySlice = array.dropLast(distance)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]

28
let a: [Int] = [0, 0, 1, 1, 2, 2, 3, 3, 4]
let b: [Int] = Array(a.prefix(5))
// result is [0, 0, 1, 1, 2]

18

সুইফট 4

একটি ভিন্ন সমাধান:

একটি সহজ ইনলাইন সমাধান যা আপনার অ্যারে খুব ছোট হলে ক্র্যাশ করবে না ont

[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 3 ? $0.element : nil }

তবে এটি দিয়ে সূক্ষ্মভাবে কাজ করে।

[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 1000 ? $0.element : nil }

সাধারণত আপনি যদি এটি করেন তবে এটি ক্রাশ হবে:

[0,1,2,3,4,5].prefix(upTo: 1000) // THIS CRASHES

[0,1,2,3,4,5].prefix(1000) // THIS DOESNT

3
সুইফট 3[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
স্টিভেনসসুও

1
ধন্যবাদ! আপনি আপডেট করতে চাইলে ফ্ল্যাটম্যাপকে অ্যারে কমপ্যাক্টের জন্য সুইফট 4-এ এখন কমপ্যাক্ট ম্যাপ বলা হয়।
মনমাল

14

একটি অ্যারের প্রথম 5 উপাদান পাওয়ার জন্য, আপনাকে যা করতে হবে তা হ'ল প্রশ্নযুক্ত অ্যারেটি টুকরো টুকরো করা। সুইফ্টে, আপনি এটি এর মতো করুন : array[0..<5].

অ্যারের N প্রথম উপাদানগুলি বাছাই করা আরও কিছুটা কার্যকর এবং সাধারণকরণযোগ্য করতে আপনি এটি করার জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন। এই ক্ষেত্রে:

extension Array {
    func takeElements(var elementCount: Int) -> Array {
        if (elementCount > count) {
            elementCount = count
        }
        return Array(self[0..<elementCount])
    }
}

5

varআপনার পদ্ধতির ঘোষণাটি আর সমর্থিত না হওয়ায় আমি সাম্প্রতিক সুইফট সংস্করণে আপডেট করার জন্য মার্কসের উত্তরটি সামান্য পরিবর্তন করেছি :

extension Array {
    func takeElements(elementCount: Int) -> Array {
        if (elementCount > count) {
            return Array(self[0..<count])
        }
        return Array(self[0..<elementCount])
    }
}

3

সুইফট 4

একটি সুইফ্ট অ্যারের প্রথম এন উপাদানগুলি পেতে আপনি ব্যবহার করতে পারেন prefix(_ maxLength: Int):

Array(largeArray.prefix(5))

1

অ্যারে প্রকারের সংরক্ষণের সাথে সুইফট 4

extension Array {
    func take(_ elementsCount: Int) -> [Element] {
        let min = Swift.min(elementsCount, count)
        return Array(self[0..<min])
    }
}

1

দ্রুত 4 এর জন্য আপডেট করুন:

[0,1,2,3,4,5].enumerated().compactMap{ $0 < 10000 ? $1 : nil }

দ্রুত 3 এর জন্য:

[0,1,2,3,4,5].enumerated().flatMap{ $0 < 10000 ? $1 : nil }

1
কার্যকরহীন সমাধান। 1) আপনি একটি অ্যারের দৈর্ঘ্যের অতিরিক্ত ক্রম তৈরি করেন। 2) আপনি সমস্ত উপাদান মাধ্যমে পুনরাবৃত্তি।
আলেকজান্ডার বেকার্ট

2
10000? ওটা কী?
BangOperator


1

বস্তুর অ্যারের জন্য আপনি সিকোয়েন্স থেকে একটি এক্সটেনশন তৈরি করতে পারেন।

extension Sequence {
    func limit(_ max: Int) -> [Element] {
        return self.enumerated()
            .filter { $0.offset < max }
            .map { $0.element }
    }
}

ব্যবহার:

struct Apple {}

let apples: [Apple] = [Apple(), Apple(), Apple()]
let limitTwoApples = apples.limit(2)

// limitTwoApples: [Apple(), Apple()]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.