ios - yunes - itunes




আমি কিভাবে এটি একটি কাস্টম বস্তু সঙ্গে একটি NSMutableArray বাছাই করবেন? (17)

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

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

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

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

NSSortDescriptor (ভাল)

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

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 ব্যবহার করার তুলনায় বেশ কিছুটা দ্রুততর হবে, যা পরবর্তীতে NSSortDescriptor তে নির্ভর করে। NSSortDescriptor পদ্ধতির প্রাথমিক সুবিধাটি হল এটি আপনার কোডের পরিবর্তে ডেটা ব্যবহার করে আপনার সাজানোর NSSortDescriptor সংজ্ঞায়িত করার একটি উপায় সরবরাহ করে, যা সহজ করে যেমন সেট আপ করে যাতে ব্যবহারকারীরা হেডার সারিতে ক্লিক করে একটি NSTableView বাছাই করতে পারে।

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

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

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

জাভাতে আমি আমার বস্তুর তুলনামূলকভাবে বাস্তবায়ন করব, অথবা একটি ইনলাইন কাস্টম তুলনাকারীর সাথে Collections.sort ব্যবহার করব ... কিভাবে আপনি Objective-C এ পৃথিবীতে এটি করবেন?


সুইফ মধ্যে অ্যারে সাজান

নীচের 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
    }
}

এখন User জন্য Array একটি extension আছে। সাধারণ শব্দের মধ্যে কেবলমাত্র সেই অ্যারের জন্য কিছু পদ্ধতি যুক্ত করুন যা এতে শুধুমাত্র 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)

Descending আদেশ জন্য ব্যবহার

let sortedArray = someArray.sortUserByDate(.orderedAscending)

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

let sortedArray = someArray.sortUserByDate(.orderedSame)

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


আইওএস 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 বিস্তারিত বিবরণ


আপনাকে সোর্সস্ক্রিপ্টর তৈরি করতে হবে এবং তারপরে আপনি sortdescriptor ব্যবহার করে নীচের msmutablearray বাছাই করতে পারেন।

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

আপনি NSSortDescriptor ব্যবহার করে কাস্টম বস্তুর সাথে একটি NSMutableArray সাজানোর জন্য

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

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

//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];

আমার ক্ষেত্রে, আমি একটি অ্যারে সাজানোর জন্য "sortedArrayUsingcomparator" ব্যবহার। নীচের কোড তাকান।

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

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

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

আমি আমার কিছু প্রকল্পে sortUsingFunction :: ব্যবহার করেছি:

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];

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

// মান সাজানোর

    [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


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

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)

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

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

NSMutableArray পদ্ধতির sortUsingFunction:context: NSMutableArray sortUsingFunction:context:

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

দুটি বস্তু শুধুমাত্র Person দৃষ্টান্ত। তৃতীয় বস্তু একটি স্ট্রিং, যেমন @ "জন্ম তারিখ"।

এই ফাংশনটি একটি NSComparisonResult : এটি যদি PersonA.birthDate NSOrderedAscending তবে PersonA.birthDate < PersonB.birthDatePersonA.birthDate > PersonB.birthDate যদি এটি PersonA.birthDate ফিরে PersonB.birthDate । অবশেষে, এটি PersonA.birthDate == PersonB.birthDate থাকলে PersonA.birthDate ফিরে PersonB.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;
}

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


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];

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

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(@"===============================");

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

ধন্যবাদ, এটা ভালো কাজ করছে ...







nsmutablearray