কোনও অভিধানে পুনরাবৃত্তি করার কোনও উপায় আছে কি?


200

আমি NSDictionariesএমন কিছু হিসাবে জানি যেখানে একটি keyপাওয়ার জন্য আপনার কোনও প্রয়োজন value। তবে কীভাবে আমি সমস্তটি keysএবং valuesক এর মধ্যে পুনরাবৃত্তি করতে পারি NSDictionary, যাতে আমি জানতে পারি কী কী আছে এবং কী মান আছে? আমি জানি কিছু আছে যা ইন-লুপ ইন বলে JavaScript। কিছু মিল আছে কি Objective-C?


এই পোস্টের জন্য ধন্যবাদ। মধ্যে iterating তাহলে Swift: সিনট্যাক্স, এই পোস্টে পড়ুন stackoverflow.com/a/24111700/419348
AechoLiu

উত্তর:


323

হ্যাঁ, NSDictionaryদ্রুত গণনা সমর্থন করে। উদ্দেশ্য-সি 2.0 এর সাহায্যে আপনি এটি করতে পারেন:

// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

বিকল্প পদ্ধতি (যা আপনি যদি ম্যাক ওএস এক্স প্রি -10.5-কে লক্ষ্য করে থাকেন তবে আপনাকে ব্যবহার করতে হবে তবে আপনি এখনও 10.5 এবং আইফোনে ব্যবহার করতে পারেন) একটি হ'ল NSEnumerator:

NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

2
ওবিজেসি আধুনিক বাক্য গঠন: এনএসএলগ (@ "কী =% @ মান =% @", কী, মাইডিক্ট [কী]);
geowar

@ দার্থিনিয়াস সাম্প্রতিক অপ্টিমাইজেশনের কারণে, কমপক্ষে কিছু ক্ষেত্রে ব্লক ভিত্তিকের চেয়ে দ্রুত গণনা আবার দ্রুত is তবে আপনি যে সমস্যার সমাধান করছেন সেটি যদি আপনাকে সমবর্তী বিকল্পটি ব্যবহার করতে দেয় তবে ব্লক-ভিত্তিক পদ্ধতিটি দ্রুততর হতে পারে।
জেভ আইজেনবার্গ

@ জাভেইজেনবার্গ আমার পোস্টের শেষে দেখুন।
রক স্ট্রিনিয়া

ওফস, আমি একটি নতুন ট্যাবে খোলার জন্য উপরে, আপনার লিঙ্কটি ক্লিক করেছি, এবং এটি কে লিখেছিল বা এটি একই পৃষ্ঠায় রয়েছে তা এমনকি খেয়ালও করতে পারি নি। আপনি যদি এখনও উপরের মন্তব্যটি সম্পাদনা করতে পারেন তবে আপনি এটি করতে চাইতে পারেন, যাতে অলস পাঠকরা ভুল ধারণা না পান।
জেভ আইজেনবার্গ

153

ব্লক পদ্ধতির প্রতিটি কী জন্য লুকিং অ্যালগরিদম চালানো এড়ানো হয় :

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
  NSLog(@"%@ => %@", key, value);
}];

যদিও NSDictionaryহিসেবে বাস্তবায়িত হয় hashtable (যার মানে হল একটি উপাদান আপ খুঁজছেন খরচ O(1)), লুক-এখনও তোমাদের পুনরাবৃত্তির দ্বারা মন্থর একটি ধ্রুবক ফ্যাক্টর

আমার পরিমাপগুলি দেখায় যে dসংখ্যার অভিধানের জন্য ...

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
  NSNumber* value = @(i);
  dict[value.stringValue] = value;
}

... ব্লক পদ্ধতির সাথে সংখ্যার যোগফল ...

__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
  sum += value.intValue;
}];

... লুপ পদ্ধতির চেয়ে ...

int sum = 0;
for (NSString* key in dict)
  sum += [dict[key] intValue];

... প্রায় 40% দ্রুত

সম্পাদনা : নতুন এসডিকে (6.1+) লুপ পুনরাবৃত্তিকে অনুকূল করে তুলবে বলে মনে হচ্ছে, তাই উপরের সরল মামলার জন্য লুপ পদ্ধতির ব্লক পদ্ধতির চেয়ে এখন প্রায় 20% দ্রুত is


আইওএস 10/11 এ কী হবে, কোনটি দ্রুত?
সুপারট্যাকনোবফ

মার্জিত, এটি ভালবাসা!
YvesLeBorg

10

এটি ব্লক পদ্ধতির সাহায্যে পুনরাবৃত্তি:

    NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};

    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@->%@",key,obj);
        // Set stop to YES when you wanted to break the iteration.
    }];

স্বতঃসম্পূর্ণতা সেট করার জন্য খুব দ্রুত, এবং আপনাকে পুনরাবৃত্তি খামটি লেখার বিষয়ে চিন্তা করতে হবে না।


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