সুইফটে একটি অ্যারেতে সর্বাধিক সন্ধান করার সঠিক উপায়


121

আমি এখন পর্যন্ত একটি সহজ (তবে সম্ভাব্য ব্যয়বহুল) উপায় পেয়েছি:

var myMax = sort(myArray,>)[0]

এবং স্কুলে এটি কীভাবে করতে শেখানো হয়েছিল:

var myMax = 0
for i in 0..myArray.count {
    if (myArray[i] > myMax){myMax = myArray[i]}
}

সুইফটে একটি পূর্ণসংখ্যা অ্যারে থেকে সর্বাধিক মান পাওয়ার আরও ভাল উপায় কী আছে? আদর্শভাবে এমন কিছু যা রুবি'র মতো এক লাইনের.max


আপনি একটি এক্সটেনশন লিখুন।
gnasher729

হ্যাঁ, এক লাইন: maxElement(myArray)। নীচের নীচে দ্বিতীয় উত্তর (রুডল্ফ অ্যাডমকভিক্স) কী তা দেখুন।
লাইকাইনেথেস্কি

যে ইয়ো পরিবর্তনের গৃহীত উত্তর এই
mattgabor

@mattymcgee আমি গৃহীত উত্তর আপডেট করেছি।
চার্লি ইগান

উত্তর:


299

প্রদত্ত:

let numbers = [1, 2, 3, 4, 5]

সুইফট 3:

numbers.min() // equals 1
numbers.max() // equals 5

সুইফট 2:

numbers.minElement() // equals 1
numbers.maxElement() // equals 5

2
কেবলমাত্র Comparableঅবজেক্টে NSDecimalNumberকাজ করে, সুতরাং উদাহরণস্বরূপ কাজ করবে না।
মিশা হার্নাস

2
এটি কেবলমাত্র আমি বা এই কার্যাদি সুইফট 2-তে বিদ্যমান নেই?
লিরন ইয়াহদাভ

@ লিরোন ইয়াহদাভ তারা এখন পদ্ধতি। সংশোধন করা হয়েছে। ধন্যবাদ!
রুডল্ফ অ্যাডমকোভিč

2
সুইফ্ট 3-এ দ্রষ্টব্য এগুলি নামকরণ করা হয়েছে সহজভাবে min()এবং max()
জেমনস

1
সুইজড 3-তে জিজেমন নং-এর পদ্ধতিগুলি minElementএবং এর maxElementনামকরণ করা হয়েছিল minএবং max। দেখুন: github.com/apple/swift-evolution/blob/master/proposals/… আমি আপনার বিভ্রান্তি বুঝতে পেরেছি, কারণ ফ্রি ফাংশন minএবং maxএছাড়াও রয়েছে also দেখুন, উদাহরণস্বরূপ, gist.github.com/lorentey/d679064cb29df4558534d619319a1d9e
জিম্মান

95

আপডেট করুন: এই সম্ভবত গৃহীত উত্তর যেহেতু হওয়া উচিত maxElementসুইফট দেখা যায়।


সর্বশক্তিমান ব্যবহার করুন reduce:

let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, { max($0, $1) })

একইভাবে:

let numMin = nums.reduce(Int.max, { min($0, $1) })

reduceএকটি অভ্যন্তরীণ সঞ্চালক ভেরিয়েবলের প্রাথমিক মান যা প্রথমে মান নেয়, তার পরে উত্তোলিত ফাংশনটি (এখানে এটি বেনামে) সঞ্চালক এবং অ্যারের প্রতিটি উপাদানকে ধারাবাহিকভাবে প্রয়োগ করে এবং নতুন মানটি সঞ্চয়ের মধ্যে সঞ্চয় করে। তারপরে সর্বশেষ সঞ্চয়ের মানটি ফেরত দেওয়া হয়।


1
নিখুঁত, ঠিক আমি যা খুঁজছিলাম। এমন অনেক কিছুই আছে যা মনে হচ্ছে আইবুকে নেই!
চার্লি ইগান

2
এগুলি কেবল সাধারণ ক্রিয়ামূলক প্রোগ্রামিং কৌশল, এগুলি সুইফ্টের সাথে নির্দিষ্ট নয়।
জিন-ফিলিপ পেলিট

10
@ জিন-ফিলিপপ্লেট আপনি আসলে এটি কেবল সহজ করতে পারবেন: nums.reduce(Int.min, max)যেহেতু maxএর প্রোটোটাইপ ইতিমধ্যে reduceপ্রত্যাশিত ধরণের সাথে মেলে
ড্রুয়েগ করুন

ডাবলসের অ্যারে নিয়ে এটি কাজ না করার কোনও কারণ আছে কি?
নিকোলাস

3
সর্বনিম্ন / সর্বাধিক ফাংশন স্বাক্ষরগুলি সম্মিলনটির সাথে মেলে: প্যারামিটারের স্বাক্ষর যাতে আপনি কেবল ফাংশনটি নিজেই পাস করতে পারেন:let numMax = nums.reduce(Int.min, combine: max)
লেসেলি গডউইন

38

সুইফট 5 দিয়ে, Array, অন্যান্য মত Sequenceপ্রোটোকল অনুসারী বস্তু ( Dictionary, Set, ইত্যাদি), দুটি পদ্ধতি বলা max()এবং max(by:)যে ফিরতি ক্রমানুসারে সর্বোচ্চ উপাদান বা nilক্রম খালি পারেন।


# 1। Arrayএর max()পদ্ধতি ব্যবহার করে

যদি আপনার ক্রম কে কনর্ফাম করে ভিতরে উপাদান টাইপ Comparableপ্রটোকল (এটা হতে পারে String, Float, Characterঅথবা আপনার কাস্টম বর্গ বা struct হয় এক), আপনি ব্যবহার করতে সক্ষম হবে max()যে নিম্নলিখিত হয়েছে ঘোষণা :

@warn_unqualified_access func max() -> Element?

ক্রমের সর্বোচ্চ উপাদানটি প্রদান করে maximum

নিম্নলিখিত খেলার মাঠের কোডগুলি ব্যবহার করতে দেখায় max():

let intMax = [12, 15, 6].max()
let stringMax = ["bike", "car", "boat"].max()

print(String(describing: intMax)) // prints: Optional(15)
print(String(describing: stringMax)) // prints: Optional("car")
class Route: Comparable, CustomStringConvertible {

    let distance: Int
    var description: String { return "Route with distance: \(distance)" }

    init(distance: Int) {
        self.distance = distance
    }

    static func ==(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance == rhs.distance
    }

    static func <(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance < rhs.distance
    }

}

let routes = [
    Route(distance: 20),
    Route(distance: 30),
    Route(distance: 10)
]

let maxRoute = routes.max()
print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)

# 2। Arrayএর max(by:)পদ্ধতি ব্যবহার করে

যদি আপনার অনুক্রমের অভ্যন্তরের উপাদান টাইপ Comparableপ্রোটোকলের সাথে সামঞ্জস্য না করে তবে আপনাকে max(by:)নিম্নলিখিত ঘোষণাটি ব্যবহার করতে হবে :

@warn_unqualified_access func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?

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

নিম্নলিখিত খেলার মাঠের কোডগুলি ব্যবহার করতে দেখায় max(by:):

let dictionary = ["Boat" : 15, "Car" : 20, "Bike" : 40]

let keyMaxElement = dictionary.max(by: { (a, b) -> Bool in
    return a.key < b.key
})

let valueMaxElement = dictionary.max(by: { (a, b) -> Bool in
    return a.value < b.value
})

print(String(describing: keyMaxElement)) // prints: Optional(("Car", 20))
print(String(describing: valueMaxElement)) // prints: Optional(("Bike", 40))
class Route: CustomStringConvertible {

    let distance: Int
    var description: String { return "Route with distance: \(distance)" }

    init(distance: Int) {
        self.distance = distance
    }

}

let routes = [
    Route(distance: 20),
    Route(distance: 30),
    Route(distance: 10)
]

let maxRoute = routes.max(by: { (a, b) -> Bool in
    return a.distance < b.distance
})

print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)

সুইফ্ট 3-এ "ম্যাক্সিলিমেট" এর নাম পরিবর্তন করে "সর্বোচ্চ" করা হয়েছে
নিকোলাই হেনরিকসেন

16

অন্যান্য উত্তরগুলি সমস্ত সঠিক, তবে ভুলে যাবেন না যে আপনি সংগ্রহ অপারেটরগুলিও নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন:

var list = [1, 2, 3, 4]
var max: Int = (list as AnyObject).valueForKeyPath("@max.self") as Int

আপনি একই পদ্ধতিতে গড়টিও পেতে পারেন:

var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double

এই বাক্য গঠনটি অন্য কয়েকটি সমাধানের চেয়ে কম পরিষ্কার হতে পারে তবে এটি -valueForKeyPath:এখনও আকর্ষণীয়ভাবে ব্যবহার করা যায় তা দেখতে আকর্ষণীয় :)


11

আপনি এর সাথে ব্যবহার করতে পারেন reduce:

let randomNumbers = [4, 7, 1, 9, 6, 5, 6, 9]
let maxNumber = randomNumbers.reduce(randomNumbers[0]) { $0 > $1 ? $0 : $1 } //result is 9

4
var numbers = [1, 2, 7, 5];    
var val = sort(numbers){$0 > $1}[0];

2
আমার কাছে এটি অনেকটা দেখতেvar myMax = sort(myArray,>)[0]
চার্লি ইগান

3
বাছাইয়ের অনেক বেশি ওভারহেড রয়েছে।
vy32

4

সুইফট ১.২ (এবং সম্ভবত পূর্বে) এর সাথে আপনার এখন ব্যবহার করা দরকার:

let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, combine: { max($0, $1) })

দ্বৈত মানগুলির সাথে কাজ করার জন্য আমি এই জাতীয় কিছু ব্যবহার করেছি:

let nums = [1.3, 6.2, 3.6, 9.7, 4.9, 6.3];
let numMax = nums.reduce(-Double.infinity, combine: { max($0, $1) })

1
আপনি কেবল এটি করতে পারেন let numMax = nums.reduce(-Double.infinity, combine: max), সর্বাধিক ফাংশন স্বাক্ষরের সাথে মিলিত হয়: পরামিতি স্বাক্ষর।
লেসলি গডউইন

3

সুইফট ২.০-তে, minElementএবং প্রোটোকলের maxElementপদ্ধতি হয়ে ওঠার জন্য SequenceTypeআপনার এগুলি বলা উচিত:

let a = [1, 2, 3]
print(a.maxElement()) //3
print(a.minElement()) //1

ব্যবহার maxElementএকটি ফাংশন হিসাবে মত maxElement(a)হয় অনুপলব্ধ এখন।

সুইফটের সিনট্যাক্সটি ফ্লক্সে রয়েছে , তাই আমি এটি কেবল এক্সকোড সংস্করণ 7 বিটা 6 এ নিশ্চিত করতে পারি

ভবিষ্যতে এটি সংশোধিত হতে পারে, সুতরাং আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এই পদ্ধতিগুলি ব্যবহার করার আগে ডকটি আরও ভাল করে পরীক্ষা করতে চান।


3

সুইফট 3.0

আপনি প্রোগ্রামটিমে এই কোডটি চেষ্টা করতে পারেন।

func getSmallAndGreatestNumber() -> Void {

    let numbers = [145, 206, 116, 809, 540, 176]
    var i = 0
    var largest = numbers[0]
    var small = numbers[0]
    while i < numbers.count{

        if (numbers[i] > largest) {
            largest = numbers[i]
        }
        if (numbers[i] < small) {
            small = numbers[i]
        }
        i = i + 1
    }
    print("Maximum Number ====================\(largest)")// 809
    print("Minimum Number ====================\(small)")// 116
}


0

সুইফ্ট 3/4 এর জন্য আপডেট হয়েছে:

অ্যারে থেকে সর্বাধিক সন্ধান করতে কোডের সহজ রেখার নীচে ব্যবহার করুন;

var num = [11, 2, 7, 5, 21]
var result = num.sorted(){
    $0 > $1
}
print("max from result: \(result[0])") // 21

-1

আপনি আপনার অ্যারে বাছাই করতে পারেন এবং তারপরে array.firstবা ব্যবহার করতে পারেনarray.last


5
এটি গণনার দিক থেকে ধীর। আপনি লিনিয়ার সময়ে সর্বাধিক সন্ধান করতে পারেন।
চার্লি ইগান

আমি খুব নতুন @ চর্লিইগান, আপনি কি লিনিয়ার সময় ব্যাখ্যা করতে পারেন বা আমাকে একটি টিউটোরিয়াল দেখিয়ে দিতে পারেন? অনেক অনেক ধন্যবাদ
সাদ গাদির

'টাইম জটিলতা' ( en.wikedia.org/wiki/Time_complexity ) এর আশেপাশে কিছু পাঠ করুন । এটিও পঠনযোগ্য: bigocheatsheet.com । কয়েকটি ভাল কাজের উদাহরণ এখানে: খানচাদেমি.আর.কম্পিউটিং
চার্লি ইগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.