আমি এটিতে কাস্টম অবজেক্টগুলির সাথে কীভাবে কোনও এনএসমিটেবলআরে বাছাই করব?


1268

আমি যা করতে চাই তা বেশ সহজ মনে হচ্ছে তবে ওয়েবে আমি কোনও উত্তর খুঁজে পাচ্ছি না। আমার একটা আছেNSMutableArray বস্তু রয়েছে এবং আসুন আমরা বলি যে তারা 'ব্যক্তি' অবজেক্ট। আমি NSMutableArrayপার্সোন.বার্থডেট অনুসারে বাছাই করতে চাই যা একটি NSDate

আমি মনে করি এই পদ্ধতির সাথে এর কিছু সম্পর্ক রয়েছে:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

জাভাতে আমি আমার অবজেক্টকে তুলনামূলক বাস্তবায়ন করব, বা একটি ইনলাইন কাস্টম তুলনাকারীর সাহায্যে সংগ্রহ সংগ্রহ করবো earth

উত্তর:


2299

পদ্ধতি তুলনা করুন

হয় আপনি আপনার বস্তুর জন্য একটি তুলনা পদ্ধতি প্রয়োগ করুন:

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

এনএসএসর্টডেস্কিটার (আরও ভাল)

বা সাধারণত আরও ভাল:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

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

ব্লক (চকচকে!)

ম্যাক ওএস এক্স 10.6 এবং আইওএস 4 থেকে একটি ব্লকের সাথে বাছাইয়ের সম্ভাবনাও রয়েছে:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

কর্মক্ষমতা

-compare:এবং ব্লক-ভিত্তিক পদ্ধতি ব্যবহার করে চেয়ে বেশ একটু দ্রুত, সাধারণভাবে হতে হবে NSSortDescriptorযেমন আধুনিক KVC উপর নির্ভর করে। NSSortDescriptorপদ্ধতির প্রাথমিক সুবিধাটি হ'ল এটি কোডের পরিবর্তে ডেটা ব্যবহার করে আপনার সাজানোর ক্রম সংজ্ঞায়নের জন্য একটি উপায় সরবরাহ করে যা কোডগুলি সেট আপ করা সহজ করে তোলে যাতে ব্যবহারকারীরা NSTableViewশিরোনাম সারিটিতে ক্লিক করে একটি বাছাই করতে পারে ।


66
প্রথম উদাহরণটিতে একটি ত্রুটি রয়েছে: আপনি জন্মের তারিখের পরিবর্তনশীলকে অন্য কোনও বস্তুর সাথে জন্মের তারিখের পরিবর্তনশীলের পরিবর্তে অন্য অবজেক্টের সাথে তুলনা করুন।
মার্টিন গজালদ্বেক

90
@ মার্টিন: ধন্যবাদ! মজার বিষয় যে এর জন্য আমি 75 টি আপগেট পাওয়ার আগে অন্য কারও নজরে পড়েনি।
জর্জি স্কলি

76
কারণ এটি স্বীকৃত উত্তর, এবং সম্ভবত বেশিরভাগ ব্যবহারকারীদের দ্বারা এটি সংজ্ঞায়িত হিসাবে বিবেচিত, এটি একটি তৃতীয়, ব্লক-ভিত্তিক উদাহরণ যুক্ত করা সহায়ক হতে পারে যাতে ব্যবহারকারীরা সচেতন হন যে এটি বিদ্যমান।
jpswain

6
@ কমলা 80: আমি চেষ্টা করেছিলাম। আমি আর কোনও ম্যাকের মালিক নই, সুতরাং আপনি কোডটি দেখতে পারলে ভাল লাগবে।
জর্জি স্কলি

11
আপনার যদি একটি থাকে তবে NSMutableArrayআমি পদ্ধতিগুলি ব্যবহার করতে পছন্দ করি sortUsingDescriptors, sortUsingFunctionবা sortUsingSelector। অ্যারে যতদূর সম্ভব পরিবর্তনযোগ্য আমার সাধারণত বাছাই করা অনুলিপি প্রয়োজন হয় না।
স্টিফান

109

NSMutableArrayপদ্ধতিটি দেখুনsortUsingFunction:context:

আপনাকে একটি তুলনা ফাংশন সেটআপ করতে হবে যা দুটি অবজেক্ট (টাইপের Person, যেহেতু আপনি দুটি Personবস্তুর তুলনা করছেন ) এবং একটি কনটেক্সট প্যারামিটার সেটআপ করতে হবে ।

দুটি বস্তু কেবল উদাহরণস্বরূপ Person । তৃতীয় বস্তুটি একটি স্ট্রিং, যেমন @ "জন্ম তারিখ"।

এই ফাংশনটি একটি প্রদান করে NSComparisonResult: এটি < NSOrderedAscendingযদি ফিরে আসে । এটি ফিরে আসবে যদি > । অবশেষে, এটা ফিরে আসবে যদি ==PersonA.birthDatePersonB.birthDateNSOrderedDescendingPersonA.birthDatePersonB.birthDateNSOrderedSamePersonA.birthDatePersonB.birthDate

এটি মোটামুটি সিউডোকোড; এক তারিখের জন্য "কম", "আরও" বা "সমান" হওয়ার জন্য অন্য তারিখের অর্থ কী তা বোঝাতে হবে (যেমন সেকেন্ড-ইপোকের তুলনা ইত্যাদি):

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  if ([firstPerson birthDate] < [secondPerson birthDate])
    return NSOrderedAscending;
  else if ([firstPerson birthDate] > [secondPerson birthDate])
    return NSOrderedDescending;
  else 
    return NSOrderedSame;
}

আপনি যদি আরও কিছু কমপ্যাক্ট চান, আপনি টার্নারি অপারেটরগুলি ব্যবহার করতে পারেন:

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;
}

ইনলাইনিং সম্ভবত এটি কিছুটা গতি পেতে পারে, আপনি যদি এটি অনেক কিছু করেন।


9
SortUsingFunction: প্রসঙ্গ: ব্যবহার করা সম্ভবত সর্বাধিক সি-ইশ উপায় এবং সুনির্দিষ্টভাবে সবচেয়ে অপঠনযোগ্য।
জর্জি স্কলি

12
এটিতে আসলে কোনও ভুল নেই, তবে আমি মনে করি এখন আরও অনেক ভাল বিকল্প রয়েছে।
জর্জি স্কলি

6
সম্ভবত, তবে আমি মনে করি না যে এটি জাভা ব্যাকগ্রাউন্ডের যে কারও কাছে জাভা বিমূর্ত তুলনামূলক শ্রেণীর সাথে অনুরূপ কিছু সন্ধান করছে, যা তুলনা প্রয়োগ করে (টাইপ অজাব 1, টাইপ অজে 2) এর চেয়ে কম পঠিত হবে।
অ্যালেক্স রেনল্ডস

5
এই সমালোচনাটির খুব অল্প প্রযুক্তিগত যোগ্যতা থাকা সত্ত্বেও, আপনার মধ্যে কয়েকজন এই পুরোপুরি সূক্ষ্ম উত্তরের সমালোচনা করার জন্য যে কোনও কারণ অনুসন্ধান করতে চাইছেন sense রহস্যময়।
অ্যালেক্স রেনল্ডস

1
@ ইয়ার: হয় আপনি প্রথম অনুচ্ছেদে প্রদত্ত সমাধানটি ব্যবহার করতে পারেন, বা আপনি একাধিক বাছাইকারী বর্ণনাকারী ব্যবহার করতে পারেন। SortArrayUsingDescripttors: আর্গুমেন্ট হিসাবে সাজানোর বর্ণনাকারীর একটি অ্যারে নেয়।
জর্জি স্কলি

62

আমি ব্লক ব্যবহার করে আইওএস 4-এ এটি করেছি। আইডি থেকে আমার শ্রেণির ধরণে আমার অ্যারের উপাদানগুলি ফেলে দিতে হয়েছিল। এই ক্ষেত্রে এটি পয়েন্ট নামক একটি সম্পত্তি সহ স্কোর নামে একটি শ্রেণি ছিল।

এছাড়াও আপনার অ্যারের উপাদানগুলি সঠিক ধরণের না হলে কী করবেন তাও আপনাকে সিদ্ধান্ত নিতে হবে, উদাহরণস্বরূপ আমি সবেমাত্র ফিরে এসেছি NSOrderedSame, তবে আমার কোডে যদিও আমি ব্যতিক্রম।

NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){
    if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) {
        Score *s1 = obj1;
        Score *s2 = obj2;

        if (s1.points > s2.points) {
            return (NSComparisonResult)NSOrderedAscending;
        } else if (s1.points < s2.points) {
            return (NSComparisonResult)NSOrderedDescending;
        }
    }

    // TODO: default is the same?
    return (NSComparisonResult)NSOrderedSame;
}];

return sorted;

PS: এটি সাজানো ক্রম অনুসারে বাছাই করা হচ্ছে।


6
আপনার সেখানে আসলে "(স্কোর *)" কাস্টের দরকার নেই, আপনি কেবল "স্কোর * এস 1 = অজানা 1" করতে পারেন; কারন সংকলক :-) থেকে সতর্কতা ছাড়াই আইডি খুশিতে কোনও কিছুতে ফেলে দেওয়া হবে
jpswain

ডান কমলা 80 downcastingদুর্বল ভেরিয়েবলের আগে cast ালাইয়ের প্রয়োজন হয় না।
থিমস্মারাইন

আপনার উপরে বা নীচে ধারাবাহিকভাবে নীল বনাম return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
বনামকে

হি ক্রিস, আমি এই কোডটি চেষ্টা করেছিলাম, আমি এইচভি আমার প্রোগ্রামে একটি রিফ্রেশ করি .. প্রথমবারের মতো আমি সঠিক কাজ করি, একটি উতরিত অর্ডার আউটপুট পেয়েছি .. তবে যখন আমি রিফ্রেশ করি। (একই ডেটা দিয়ে একই কোডটি কার্যকর করা) এটি বদলে গেল ক্রমটি, এটি অবতরণ করা হয়নি .. বলুন আমি আমার অ্যারেতে 4 টি অবজেক্ট, 3 এইচভি একই ডেটা, 1 টি পৃথক।
নিকেশ কে

আপনি যদি বাস্তবে "স্কোর" শ্রেণির না থেকে এমন প্রত্যাশাগুলি করেন তবে আপনাকে সেগুলি আরও সতর্কতার সাথে সাজানোর প্রয়োজন। অন্যথায় আপনার এমন পরিস্থিতি রয়েছে যেখানে অন্যান্য == স্কোর 1 <স্কোর 2 == অন্যান্য যা বেমানান এবং সমস্যার কারণ হতে পারে। আপনি এমন কোনও মান প্রত্যাবর্তন করতে পারেন যা অন্য সমস্ত বস্তুর আগে স্কোর অবজেক্টগুলি বাছাই করে এবং অন্যান্য সমস্ত অবজেক্ট একে অপরের সমান সাজান।
gnasher729

29

আইওএস 4 এ শুরু করে আপনি বাছাইয়ের জন্য ব্লকও ব্যবহার করতে পারেন।

এই বিশেষ উদাহরণস্বরূপ আমি অভিমানী করছি আপনার অ্যারের মধ্যে বস্তুর একটি 'অবস্থান' পদ্ধতি, যা একটি ফেরৎ আছে NSInteger

NSArray *arrayToSort = where ever you get the array from... ;
NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
{
    if ([obj1 position] > [obj2 position]) 
    { 
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 position] < [obj2 position]) 
    {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};
NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];

দ্রষ্টব্য: "সাজানো" অ্যারেটি স্বতঃপ্রযুক্ত হবে।


26

আমি সব চেষ্টা করেছিলাম, কিন্তু এটি আমার পক্ষে কাজ করেছিল। একটি ক্লাসে আমার " crimeScene" নামে আরও একটি ক্লাস রয়েছে , এবং " " এর একটি সম্পত্তি অনুসারে বাছাই করতে চাই crimeScene

এটি একটি কবজির মতো কাজ করে:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"crimeScene.distance" ascending:YES];
[self.arrAnnotations sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

21

জর্জি শুলির দ্বিতীয় উত্তরের একটি অনুপস্থিত পদক্ষেপ রয়েছে , তবে এটি ঠিক কাজ করে।

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

// 'টি' যুক্ত করেছে কারণ সময় নষ্ট হয়ে গেছে যখন আমি অনুলিপি করেছি এবং আটকানো হয়েছিল এবং এটি সাজানোআর্য ইউজিংডেস্কিপ্টরে 'গুলি' ব্যতীত ব্যর্থ হয়েছিল


পদ্ধতির কলটি আসলে "সাজানোআরেউজিংডেস্কিপটর:", শেষে একটি 'গুলি' সহ।
সিআইফিল্টার

19
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

ধন্যবাদ, এটা ঠিকঠাক কাজ করছে ...


17

আপনার Personঅবজেক্টগুলিকে কোনও পদ্ধতি বাস্তবায়ন করা দরকার, বলুন compare:যা অন্য কোনও Personঅবজেক্ট নেয় এবং ফিরে আসেNSComparisonResult 2 টি বস্তুর মধ্যে সম্পর্ক অনুসারে ।

তাহলে আপনি ফোন sortedArrayUsingSelector:করবেন@selector(compare:) এবং এটি করা উচিত।

অন্যান্য উপায় আছে, তবে যতদূর আমি জানি Comparableইন্টারফেসের কোনও কোকো সমতুল্য নেই । sortedArrayUsingSelector:এটি করা সম্ভবত ব্যথাহীন উপায় ব্যবহার করা।


9

আইওএস 4 ব্লক আপনাকে বাঁচাবে :)

featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
{
    DMSeatFeature *first = ( DMSeatFeature* ) a;
    DMSeatFeature *second = ( DMSeatFeature* ) b;

    if ( first.quality == second.quality )
        return NSOrderedSame;
    else
    {
        if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
        {
            if ( first.quality < second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        }
        else // eSeatQualityRed || eSeatQualityYellow
        {
            if ( first.quality > second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        } 
    }
}] retain];

http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html কিছুটা বর্ণনা


8

জন্য NSMutableArray, sortUsingSelectorপদ্ধতি ব্যবহার করুন । এটি কোনও নতুন উদাহরণ তৈরি না করেই এটি স্থানটি সাজায়।


কেবলমাত্র একটি আপডেট: আমিও এমন কিছু সন্ধান করছিলাম যা জায়গায় পরিবর্তিত অ্যারে বাছাই করল, এখন আইওএস 7. এর মতো সমস্ত "সোর্টার্ডআরেইউজিং" পদ্ধতির জন্য "সন্ধান করা" সমতুল্য পদ্ধতি রয়েছে Such যেমন sortUsingComparator:
জামাতেজে

7

আপনি আপনার উদ্দেশ্যে নিম্নলিখিত জেনেরিক পদ্ধতিটি ব্যবহার করতে পারেন। এটি আপনার সমস্যা সমাধান করা উচিত।

//Called method
-(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
    [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    return arrDeviceList;
}

//Calling method
[self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];

6

আপনি যদি কেবল একটি অ্যারে বাছাই করেন তবে আপনি NSNumbersতাদের 1 টি কল দিয়ে বাছাই করতে পারেন:

[arrayToSort sortUsingSelector: @selector(compare:)];

এটি কাজ করে কারণ অ্যারেতে থাকা NSNumberবস্তুগুলি ( বস্তুগুলি) তুলনা পদ্ধতিটি প্রয়োগ করে। আপনি NSStringঅবজেক্টগুলির জন্য , এমনকি এমন কোনও কাস্টম ডেটা অবজেক্টগুলির একটি অ্যারেও করতে পারেন যা তুলনামূলক পদ্ধতিটি প্রয়োগ করে।

তুলনামূলক ব্লক ব্যবহার করে এখানে কয়েকটি উদাহরণ কোড দেওয়া হয়েছে। এটি অভিধানের একটি অ্যারে বাছাই করে যেখানে প্রতিটি অভিধানে একটি কী "সাজানো_কি" তে একটি সংখ্যা অন্তর্ভুক্ত করে।

#define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
 ^(id obj1, id obj2) 
  {
  NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
  NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
  if (value1 > value2) 
{
  return (NSComparisonResult)NSOrderedDescending;
  }

  if (value1 < value2) 
{
  return (NSComparisonResult)NSOrderedAscending;
  }
    return (NSComparisonResult)NSOrderedSame;
 }];

উপরের কোডটি প্রতিটি সাজানোর কীটির জন্য একটি পূর্ণসংখ্যার মান পাওয়ার এবং এটি কীভাবে করা যায় তার উদাহরণ হিসাবে তাদের তুলনা করার কাজ করে। যেহেতু NSNumberবস্তুগুলি একটি তুলনামূলক পদ্ধতি কার্যকর করে, তাই এটি আরও অনেক সহজভাবে আবারও লেখা যেতে পারে:

 #define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
^(id obj1, id obj2) 
 {
  NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
  NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
  return [key1 compare: key2];
 }];

বা তুলনাকারীর বডিটি এমনকি 1 লাইন পর্যন্ত নিঃসৃত করা যেতে পারে:

  return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];

আমি সাধারণ বিবৃতি এবং প্রচুর অস্থায়ী ভেরিয়েবলগুলিকে পছন্দ করি কারণ কোডটি পড়া সহজ, এবং ডিবাগ করা সহজ। সংকলক অস্থায়ী ভেরিয়েবলগুলি যেভাবেই হোক অপসারণ করে তাই সর্ব-এক-লাইন সংস্করণের কোনও সুবিধা নেই version


5

আমি ল্যাটাক টু অবজেক্টিভ সি নামক বিভাগের একটি ছোট গ্রন্থাগার তৈরি করেছি , যা এই ধরণের জিনিসটিকে আরও সহজ করে তোলে। কী নির্বাচকের সাথে বাছাই পদ্ধতিটি ব্যবহার করে আপনি birthDateনিম্নলিখিত অনুসারে বাছাই করতে পারেন :

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

আপনার এটিকে " লিনকিউ টু অবজেক্টিভ-সি " বলা উচিত।
পিটার মর্টেনসেন

5

আমি কেবলমাত্র কাস্টম প্রয়োজনীয়তার ভিত্তিতে মাল্টি লেভেল বাছাই করেছি।

// মানগুলি বাছাই করুন

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec


5

আমি আমার কয়েকটি প্রকল্পে सॉर्ट-ইউজিং ফাংশন :: ব্যবহার করেছি :

int SortPlays(id a, id b, void* context)
{
    Play* p1 = a;
    Play* p2 = b;
    if (p1.score<p2.score) 
        return NSOrderedDescending;
    else if (p1.score>p2.score) 
        return NSOrderedAscending;
    return NSOrderedSame;
}

...
[validPlays sortUsingFunction:SortPlays context:nil];

5

আপনি কাস্টম অবজেক্টের সাথে একটি এনএসমিটেবলআরে বাছাই করতে এনএসএসর্টডেস্কিটার ব্যবহার করেন

 NSSortDescriptor *sortingDescriptor;
 sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                       ascending:YES];
 NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

4
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

কেন কোনও পরিবর্তনযোগ্য অ্যারে পাস করবেন, যখন একটি নতুন অ্যারে ফিরে আসে। আদৌ কেন একটি র‌্যাপার তৈরি করবেন?
ভাইকিংগুন্ডো

3

বাছাই NSMutableArrayকরা খুব সহজ:

NSMutableArray *arrayToFilter =
     [[NSMutableArray arrayWithObjects:@"Photoshop",
                                       @"Flex",
                                       @"AIR",
                                       @"Flash",
                                       @"Acrobat", nil] autorelease];

NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];

for (NSString *products in arrayToFilter) {
    if (fliterText &&
        [products rangeOfString:fliterText
                        options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)

        [productsToRemove addObject:products];
}
[arrayToFilter removeObjectsInArray:productsToRemove];

2

NSComparator ব্যবহার করে বাছাই করুন

আমরা যদি কাস্টম অবজেক্টগুলিকে বাছাই করতে চাই তবে আমাদের সরবরাহ করতে হবে NSComparatorযা কাস্টম অবজেক্টগুলির তুলনায় ব্যবহৃত হয়। NSComparisonResultদুটি বস্তুর ক্রম বোঝাতে ব্লকটি একটি মান দেয়। সুতরাং পুরো অ্যারে বাছাই করার জন্য NSComparatorনিম্নলিখিত পদ্ধতিতে ব্যবহৃত হয়।

NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
    return [e1.firstname compare:e2.firstname];    
}];

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

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

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

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

রেফারেন্স এবং বিস্তারিত আলোচনার জন্য দয়া করে রেফার করুন: https://developer.apple.com/library/ios/docamentation/Cocoa/Conceptual/SortDescripttors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorial / Objective-C / কিভাবে টু সাজানোর-nsarray-সঙ্গে-অর্ডারি বস্তু /


1

সুইফটের প্রোটোকল এবং ফাংশনাল প্রোগ্রামিং আপনাকে খুব সহজেই তুলনামূলক প্রোটোকলের সাথে আপনার ক্লাসটি তৈরি করতে হবে, প্রোটোকলের প্রয়োজনীয় পদ্ধতিগুলি বাস্তবায়ন করতে হবে এবং তারপরে সাজানোর (দ্বারা:) হাই অর্ডার ফাংশনটি ব্যবহারের প্রয়োজন ছাড়াই বাছাই করা অ্যারে তৈরি করতে হবে উপায় দ্বারা পরিবর্তনযোগ্য অ্যারে।

class Person: Comparable {
    var birthDate: NSDate?
    let name: String

    init(name: String) {
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
    }

    static func <(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
    }

    static func >(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
    }

}

let p1 = Person(name: "Sasha")
p1.birthDate = NSDate() 

let p2 = Person(name: "James")
p2.birthDate = NSDate()//he is older by miliseconds

if p1 == p2 {
    print("they are the same") //they are not
}

let persons = [p1, p2]

//sort the array based on who is older
let sortedPersons = persons.sorted(by: {$0 > $1})

//print sasha which is p1
print(persons.first?.name)
//print James which is the "older"
print(sortedPersons.first?.name)

1

আমার ক্ষেত্রে, আমি অ্যারে বাছাই করতে "सॉোর্টডআরাইউজিংকম্পারেটর" ব্যবহার করি। নীচের কোডটি দেখুন।

contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
    NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
    NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
    return [obj1Str compare:obj2Str];
}];

আমার উদ্দেশ্য হ'ল,

@interface ContactListData : JsonData
@property(nonatomic,strong) NSString * contactName;
@property(nonatomic,strong) NSString * contactSurname;
@property(nonatomic,strong) NSString * contactPhoneNumber;
@property(nonatomic) BOOL isSelected;
@end

1

আপনি বাছাই করতে চান ডিজিটালেক্টর এবং তারপরে আপনি নীচের মতো বাছাই করে ডিজিটালেক্টর ব্যবহার করে nsmutablearray বাছাই করতে পারেন।

 let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
 let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
 print(array)

1

নেস্টেড বস্তুগুলির জন্য এটির মতো ব্যবহার করুন,

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];

লাস্ট রুট হ'ল একটি অবজেক্ট এবং সেই অবজেক্টটি হ'ল অবজেক্টকে ধরে রাখে, যে অবজেক্টটি লাস্ট নেম স্ট্রিংয়ের মান ধরে রাখে।


0

সুইফ এ অ্যারে বাছাই করুন


জন্য Swiftyপারসন নীচে একটি খুব পরিষ্কার কৌশল বিশ্বব্যাপী জন্য লক্ষ্য উপরে অর্জন হয়। আসুন একটি কাস্টম শ্রেণীর উদাহরণ রয়েছে Userযার কয়েকটি বৈশিষ্ট্য রয়েছে।

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
}

এখন আমাদের একটি অ্যারে রয়েছে যা আমাদের createdDateআরোহণ এবং / অথবা অবরোহনের ভিত্তিতে বাছাই করতে হবে । সুতরাং তারিখ তুলনা জন্য একটি ফাংশন যোগ করা যাক।

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
    func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
        if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
            //This line will compare both date with the order that has been passed.
            return myCreatedDate.compare(othersCreatedDate) == order
        }
        return false
    }
}

এখন extensionএর Arrayজন্য একটি এর আছে User। সহজ কথায় কেবল সেই অ্যারেগুলির জন্য কিছু পদ্ধতি যুক্ত করা যাক যার মধ্যে কেবলমাত্র Userএটির মধ্যে বস্তু রয়েছে।

extension Array where Element: User {
    //This method only takes an order type. i.e ComparisonResult.orderedAscending
    func sortUserByDate(_ order: ComparisonResult) -> [User] {
        let sortedArray = self.sorted { (user1, user2) -> Bool in
            return user1.checkForOrder(user2, order)
        }
        return sortedArray
    }
}

ক্রমবর্ধমান আদেশের জন্য ব্যবহার

let sortedArray = someArray.sortUserByDate(.orderedAscending)

অবতরণ আদেশ জন্য ব্যবহার

let sortedArray = someArray.sortUserByDate(.orderedAscending)

একই আদেশের জন্য ব্যবহার

let sortedArray = someArray.sortUserByDate(.orderedSame)

উপরের পদ্ধতিটি extensionকেবলমাত্র Arrayপ্রকারের হলে অ্যাক্সেসযোগ্য হবে [User]||Array<User>


0

সুইফ্ট সংস্করণ: 5.1

আপনার যদি কাস্টম স্ট্রাক্ট বা ক্লাস থাকে এবং এগুলি নির্বিচারে বাছাই করতে চান, আপনার নির্দিষ্ট ক্ষেত্রের ক্ষেত্রে সাজানো ট্রেলিং ক্লোজার ব্যবহার করে আপনার বাছাই করা উচিত ()। নির্দিষ্ট বৈশিষ্ট্য অনুসারে বাছাই করা কাস্টম স্ট্রকের একটি অ্যারে ব্যবহার করে এখানে একটি উদাহরণ রয়েছে:

    struct User {
        var firstName: String
    }

    var users = [
        User(firstName: "Jemima"),
        User(firstName: "Peter"),
        User(firstName: "David"),
        User(firstName: "Kelly"),
        User(firstName: "Isabella")
    ]

    users.sort {
        $0.firstName < $1.firstName
    }

আপনি যদি স্থানে সাজানোর পরিবর্তে বাছাই করা অ্যারেটি ফিরিয়ে দিতে চান তবে এইভাবে বাছাই করা () ব্যবহার করুন:

    let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
    }

0
  let sortedUsers = users.sorted {
    $0.firstName < $1.firstName
 }

প্রশ্ন NSMutableArray সম্পর্কে, সুইফটে অ্যারে সংগ্রহ সম্পর্কে নয়
রিকার্ডো

-2
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];

[stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];

NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];

ForeignStockHolding *stockHoldingCompany;

NSLog(@"Fortune 6 companies sorted by Company Name");

    while (stockHoldingCompany = [enumerator nextObject]) {
        NSLog(@"===============================");
        NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
        NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
        NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
        NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
        NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
        NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
    }
    NSLog(@"===============================");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.