সুইফটে একটি অভিধানের মাধ্যমে আইট্রেটিং


220

এক্সকড যে উত্তরটি আমাকে সুইফ্ট প্রোগ্রামিং ভাষা নির্দেশিকাতে এই পরীক্ষা-নিরীক্ষায় দিচ্ছে তাতে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি:

// Use a for-in to iterate through a dictionary (experiment)

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

আমি বুঝতে পারি যে অভিধানটি রূপান্তরিত হচ্ছে, বৃহত্তম সংখ্যাটি চলকটিতে সেট করা হচ্ছে largest,। যাইহোক, আমি XCode কেন largestপ্রতিটি পরীক্ষার উপর নির্ভর করে 5 বার, বা 1 সময়, বা 3 বার সেট করা হচ্ছে তা সম্পর্কে বিভ্রান্ত হয়ে পড়েছি ।

কোডটি সন্ধান করার সময় আমি দেখতে পাচ্ছি যে এটি "প্রাইম" এ 6 বার সেট করা উচিত (2, 3, 5, 7, 11, 13)। তারপরে এটি "ফিবোনাচি" এর যে কোনও সংখ্যার উপরে চলে যাওয়া উচিত যেহেতু এগুলি সমস্ত বৃহত্তমের চেয়ে কম, যা বর্তমানে "প্রধানমন্ত্রী" থেকে 13 এ সেট করা আছে। তারপরে, এটি 16 এ সেট করা উচিত এবং অবশেষে 25 স্কোয়ারে মোট 8 বার উপার্জন করা উচিত।

আমি কি পুরোপুরি সুস্পষ্ট কিছু মিস করছি?

উত্তর:


354

সুইফট (এবং অন্যান্য ভাষায়) অভিধানের অর্ডার দেওয়া হয় না। আপনি যখন অভিধানটি পুনরাবৃত্তি করেন, তখন কোনও গ্যারান্টি নেই যে অর্ডারটি আরম্ভের আদেশের সাথে মিলবে। এই উদাহরণে, সুইফ্ট অন্যদের আগে "স্কয়ার" কী প্রসেস করে। আপনি এটি লুপে একটি মুদ্রণ বিবৃতি যোগ করে দেখতে পারেন। 25 স্কোয়ারের 5 তম উপাদান তাই স্কোয়ারের 5 টি উপাদানের জন্য 5 বার সেট করা বৃহত্তম হবে এবং তারপরে 25 এ থাকবে।

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

এই মুদ্রণ:

kind: Square
kind: Prime
kind: Fibonacci

1
তোমাকে অনেক ধন্যবাদ! আমি কিছুক্ষণ স্টাম্পড হয়ে গেলাম। আমি প্রতিটি কীটির বিশ্লেষণের আশায় সংখ্যা যুক্ত করে মুছে ফেলি, তবে আমি কোথাও পাচ্ছিলাম না। আপনার ব্যাখ্যা খুব প্রশংসিত প্রশংসা!
নিক কোহরন

15
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

ফলাফল হবে

("ফার্স্টনাম", "ম্যানিন্ডার") ("লাস্টনাম", "সিংহ") ("ঠিকানা", "চণ্ডীগড়")


এই উদাহরণটি যদি 1,000 ডাটা লুপে আরও দক্ষ হয় তবে আপনি আমাকে বলতে পারবেন? কারণ আমার কাছে একটি বড় জেএসএন রয়েছে, তাই এটি আমাকে শেষে 1 জিবি প্রসেসিংয়ের দরকার। নতুন ডিভাইসগুলি ক্র্যাশ করবে না, তবে আমার আইফোন 5 এস 16 জিবি এর অর্ধেক ক্রাশ sh
ড্যানিয়েল আরান্তেস লাভার্ড

এটি মূল বিভ্রান্তিকর বলে মনে হচ্ছে যে অভিধানগুলি তাদের ক্রম বজায় রাখে কিনা তা নিয়ে আপনি যখন একটি উদাহরণ পোস্ট করেন যেখানে তারা যখন তাদের আদেশটি বজায় রাখে না তখন।
ডিক্লান ম্যাক কেনেন

12

এটি অভিধানের মাধ্যমে পুনরাবৃত্তি করার জন্য এটি একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন:

func findDic(dict: [String: String]){
    for (key, value) in dict{
    print("\(key) : \(value)")
  }
}

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow

11

এখানে সেই পরীক্ষার বিকল্প রয়েছে (সুইফট 3.0)। এটি আপনাকে জানায় যে কোন ধরণের সংখ্যাটি সবচেয়ে বড়।

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]

var largest = 0
var whichKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
        whichKind = kind
        largest = number
    }
  }
}

print(whichKind)
print(largest)

OUTPUT:
Optional("Square")
25

8

আপনি যদি সমস্ত মানগুলি পুনরাবৃত্তি করতে চান:

dict.values.forEach { value in
    // print(value)
}

আমি সত্যকে এতটা ঘৃণা করি যে এটি সঠিক। নির্বোধ জোদা দ্রুতগতির স্রষ্টাকে সবার সাথে কথা বলতে হবে! 🤮
সেবাস্তিয়ান

4

অ্যারেগুলিকে সংগ্রহের আদেশ দেওয়া হয়েছে তবে অভিধান এবং সেটগুলি আনর্ডারড সংগ্রহ। সুতরাং আপনি অভিধান বা একটি সেটে পুনরাবৃত্তির ক্রমটি পূর্বাভাস দিতে পারবেন না।

সংগ্রহের ধরণগুলি সম্পর্কে আরও জানতে এই নিবন্ধটি পড়ুন : সুইফ্ট প্রোগ্রামিং ভাষা


1

আপনি values.makeIterator()ডিক মানগুলি পুনরাবৃত্তি করতে এটির মতো ব্যবহার করতে পারেন:

for sb in sbItems.values.makeIterator(){
    // do something with your sb item..
    print(sb)
}

আপনি আরও তীব্র শৈলীতে এ জাতীয় পুনরাবৃত্তিটি করতে পারেন:

sbItems.values.makeIterator().forEach{
    // $0 is your dict value..
    print($0) 
}

* sbItemsটাইম ডিক্ট[String : NSManagedObject]

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