कैसे एक NSArray वर्णानुक्रम में सॉर्ट करने के लिए?


375

मैं [UIFont familyNames]वर्णमाला के क्रम से भरे हुए सरणी को कैसे क्रमबद्ध कर सकता हूं ?

जवाबों:


725

सबसे सरल तरीका है, एक प्रकार का चयनकर्ता प्रदान करना ( विवरण के लिए Apple का प्रलेखन )

उद्देश्य सी

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
दस्तावेज़ीकरण लिंक पुराना है, कोड नमूना वास्तव में सरणी को सॉर्ट करने के लिए पर्याप्त नहीं है। localizedCaseInsensitiveCompare: किसी भी तरह परिभाषित करने की आवश्यकता है।
एम। रयान

34
मैंने लिंक अपडेट किया। यह बात बताने के लिए धन्यवाद। localizedCaseInsensitiveCompare: NSString की एक विधि है और स्ट्रिंग्स की एक सरणी को सॉर्ट करने के लिए पर्याप्त होनी चाहिए।
थॉमस ज़ोचलिंग

1
और यह आसानी से किसी भी कस्टम ऑब्जेक्ट (न केवल NSString) युक्त सरणी पर लागू किया जा सकता है। आपको बस यह सुनिश्चित करना है कि आपके सरणी के अंदर की सभी वस्तुओं ने यह संदेश लागू कर दिया है कि चयनकर्ता निर्दिष्ट कर रहा है। फिर इस संदेश के अंदर आप अपनी वस्तु के गुणों के लिए NSString की तुलना करें जिसे आप तुलना करना चाहते हैं।
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यह एक वैध कुंजी नहीं है। NSSortDescriptor के साथ तार को वर्णानुक्रम में सॉर्ट करने के लिए मुझे किस कुंजी का उपयोग करना चाहिए?
temporary_user_name

27

NSNumericSearch जैसी चीज़ों का उपयोग करने के लिए NSString की सूची छाँटने का एक अधिक शक्तिशाली तरीका:

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

इसमें पहले से ही अधिकांश उद्देश्यों के लिए अच्छे उत्तर हैं, लेकिन मैं उन्हें जोड़ दूंगा जो अधिक विशिष्ट है।

अंग्रेजी में, आम तौर पर जब हम वर्णमाला करते हैं, तो हम वाक्यांश की शुरुआत में "द" शब्द को अनदेखा कर देते हैं। इसलिए "द यूनाइटेड स्टेट्स" को "U" के तहत ऑर्डर दिया जाएगा और "T" को नहीं।

यह आपके लिए है।

इन श्रेणियों में रखना सबसे अच्छा होगा।

// 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];
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.