একটি এনএসআরিকে বর্ণমালা অনুসারে কীভাবে সাজানো যায়?


375

আমি [UIFont familyNames]বর্ণানুক্রমিক ক্রমে ভরা একটি অ্যারে কীভাবে বাছাই করতে পারি ?

উত্তর:


725

সর্বাধিক সহজ পদ্ধতিটি হল, বাছাইকারী নির্বাচক সরবরাহ করার জন্য ( বিশদটির জন্য অ্যাপলের ডকুমেন্টেশন )

উদ্দেশ্য গ

sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

দ্রুতগতি

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "YourKey", ascending: true, selector: "localizedCaseInsensitiveCompare:")
let sortedResults: NSArray = temparray.sortedArrayUsingDescriptors([descriptor])

অ্যাপল বর্ণানুক্রমিক বাছাইয়ের জন্য বেশ কয়েকটি নির্বাচক সরবরাহ করে:

  • compare:
  • caseInsensitiveCompare:
  • localizedCompare:
  • localizedCaseInsensitiveCompare:
  • localizedStandardCompare:

দ্রুতগতি

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort()
print(students)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"

উল্লেখ


5
ডকুমেন্টেশন লিঙ্কটি পুরানো, কোড নমুনা আসলে অ্যারে বাছাই করার জন্য যথেষ্ট নয়। লোকালাইজড কেসআইসেনসেটিভকম্পার: কোনওভাবে সংজ্ঞায়িত করা দরকার।
এম রায়ান

34
আমি লিঙ্কটি আপডেট করেছি। যে ইশারা জন্য ধন্যবাদ। লোকালাইজড কেসআইসেনসেটিভকম্পার: এনএসএসআরটিংয়ের একটি পদ্ধতি এবং স্ট্রিংগুলির অ্যারে বাছাই করার জন্য পর্যাপ্ত হওয়া উচিত।
থমাস জোচলিং

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

এ জাতীয় সহজ জিনিসগুলি এত জটিল হওয়া উচিত নয়।
দিমিত্রি

276

এখানে প্রদত্ত অন্যান্য উত্তরগুলি উল্লেখ করে @selector(localizedCaseInsensitiveCompare:) এটি এনএসএসটিংয়ের একটি অ্যারের পক্ষে দুর্দান্ত কাজ করে , তবে আপনি যদি অন্য কোনও বস্তুর কাছে এটি প্রসারিত করতে চান এবং সেই বিষয়গুলিকে একটি 'নাম' সম্পত্তি অনুসারে বাছাই করতে চান তবে পরিবর্তে আপনার এটি করা উচিত:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
sortedArray=[anArray sortedArrayUsingDescriptors:@[sort]];

আপনার অবজেক্টগুলি সেই জিনিসগুলির নামের সম্পত্তি অনুসারে বাছাই করা হবে।

আপনি যদি বাছাই করতে চান তবে সংবেদনশীল হতে হবে, আপনার এই জাতীয় বিবরণী সেট করতে হবে

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

14
+1, আপনাকে ধন্যবাদ। মজার এটি গ্রহণযোগ্য উত্তরের চেয়ে বেশি সাধারণ ব্যবহারের কেস।
বিনয় ডাব্লু

4
এটি প্রথমে বড় অক্ষরগুলি এবং তারপরে ছোট ছোট অক্ষরগুলি বাছাই করে
হার্শিত

+1, বাছাইকারী সহ ধরণের বর্ণনাকারী হ'ল আমি যা চেয়েছিলাম ঠিক তেমনই অন্য কোনও উত্তর নেই। অনেক অনেক লোককে ধন্যবাদ
গণেশ সোমানী

1
আমি যখন একটি স্ট্রিংয়ের অ্যারের এভাবে সাজানোর চেষ্টা করি তখন আমি একটি ত্রুটি পাই কারণ nameএকটি বৈধ কী নয়। এনএসএসর্টডেস্কিপ্টরের সাহায্যে স্ট্রিংগুলি বর্ণানুক্রমিকভাবে বাছাই করতে আমি কী কী ব্যবহার করব?
অস্থায়ী_ ব্যবহারকারী_নাম

27

এনএসএনমেরিকস অনুসন্ধানের মতো জিনিসগুলি ব্যবহার করতে এনএসএসস্ট্রিংয়ের একটি তালিকা বাছাইয়ের আরও শক্তিশালী উপায়:

NSArray *sortedArrayOfString = [arrayOfString sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
        }];

SortDescriptor এর সাথে সম্মিলিত, এটি এমন কিছু দেবে:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
        return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
    }];
NSArray *sortedArray = [anArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

10

বর্ণানুক্রমিক ক্রমে বাছাই করার জন্য কোডের নীচে ব্যবহার করুন:

    NSArray *unsortedStrings = @[@"Verdana", @"MS San Serif", @"Times New Roman",@"Chalkduster",@"Impact"];

    NSArray *sortedStrings =
    [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];

    NSLog(@"Unsorted Array : %@",unsortedStrings);        
    NSLog(@"Sorted Array : %@",sortedStrings);

নীচে কনসোল লগ রয়েছে:

2015-04-02 16:17:50.614 ToDoList[2133:100512] Unsorted Array : (
    Verdana,
    "MS San Serif",
    "Times New Roman",
    Chalkduster,
    Impact
)

2015-04-02 16:17:50.615 ToDoList[2133:100512] Sorted Array : (
    Chalkduster,
    Impact,
    "MS San Serif",
    "Times New Roman",
    Verdana
)

10

স্ট্রিংগুলির অ্যারে বাছাই করার জন্য আরও একটি সহজ পদ্ধতি এনএসএসটিং descriptionসম্পত্তিটি এভাবে ব্যবহার করে থাকে :

NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];

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

3

এর মধ্যে বেশিরভাগ উদ্দেশ্যে ইতিমধ্যে ভাল উত্তর রয়েছে তবে আমি আমার যুক্ত করব যা আরও নির্দিষ্ট specific

ইংরেজী ভাষায়, সাধারণত যখন আমরা বর্ণমালা করি তখন আমরা একটি বাক্যাংশের শুরুতে "দ্য" শব্দটিকে উপেক্ষা করি। সুতরাং "ইউনাইটেড স্টেটস" "ইউ" এর অধীন অর্ডার করা হবে "টি" নয়।

এটি আপনার জন্য এটি করে।

এগুলি বিভাগগুলিতে রাখাই ভাল হবে।

// Sort an array of NSStrings alphabetically, ignoring the word "the" at the beginning of a string.

-(NSArray*) sortArrayAlphabeticallyIgnoringThes:(NSArray*) unsortedArray {

    NSArray * sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSString* a, NSString* b) {

        //find the strings that will actually be compared for alphabetical ordering
        NSString* firstStringToCompare = [self stringByRemovingPrecedingThe:a];
        NSString* secondStringToCompare = [self stringByRemovingPrecedingThe:b];

        return [firstStringToCompare compare:secondStringToCompare];
    }];
    return sortedArray;
}

// Remove "the"s, also removes preceding white spaces that are left as a result. Assumes no preceding whitespaces to start with. nb: Trailing white spaces will be deleted too.

-(NSString*) stringByRemovingPrecedingThe:(NSString*) originalString {
    NSString* result;
    if ([[originalString substringToIndex:3].lowercaseString isEqualToString:@"the"]) {
        result = [[originalString substringFromIndex:3] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    }
    else {
        result = originalString;
    }
    return result;
}

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

1
-(IBAction)SegmentbtnCLK:(id)sender
{ [self sortArryofDictionary];
    [self.objtable reloadData];}
-(void)sortArryofDictionary
{ NSSortDescriptor *sorter;
    switch (sortcontrol.selectedSegmentIndex)
    {case 0:
            sorter=[[NSSortDescriptor alloc]initWithKey:@"Name" ascending:YES];
            break;
        case 1:
            sorter=[[NSSortDescriptor alloc]initWithKey:@"Age" ascending:YES];
            default:
            break; }
    NSArray *sortdiscriptor=[[NSArray alloc]initWithObjects:sorter, nil];
    [arr sortUsingDescriptors:sortdiscriptor];
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.