วิธีการจัดเรียง NSArray ตามลำดับตัวอักษร?


คำตอบ:


725

วิธีที่ง่ายที่สุดคือให้ตัวเลือกการเรียง ( เอกสารของ Appleสำหรับรายละเอียด)

Objective-C

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

รวดเร็ว

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

Apple มีตัวเลือกหลายตัวสำหรับการจัดเรียงตามตัวอักษร:

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

รวดเร็ว

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

การอ้างอิง


5
ลิงก์เอกสารล้าสมัยตัวอย่างโค้ดไม่เพียงพอสำหรับการจัดเรียงอาร์เรย์ localizedCaseInsensitiveCompare: ต้องมีการกำหนดอย่างใด
M. Ryan

34
ฉันอัพเดทลิงค์ ขอบคุณสำหรับการชี้ให้เห็นว่า localizedCaseInsensitiveCompare: เป็นวิธีการของ NSString และควรจะเพียงพอที่จะเรียงลำดับของสตริง
Thomas Zoechling

1
และสิ่งนี้สามารถนำไปใช้กับอาร์เรย์ที่มีวัตถุที่กำหนดเองได้อย่างง่ายดาย (ไม่ใช่แค่ NSString) คุณต้องตรวจสอบให้แน่ใจว่าวัตถุทั้งหมดที่อยู่ในอาร์เรย์ของคุณได้ใช้งานข้อความที่ตัวเลือกกำลังระบุ จากนั้นภายในข้อความนี้คุณเพียงเรียก NSString Compare เพื่อดูคุณสมบัติของวัตถุที่คุณต้องการเปรียบเทียบ
lgdev

สิ่งที่เรียบง่ายเช่นนั้นจะต้องไม่ซับซ้อน
Dmitry

276

คำตอบอื่น ๆ ที่ระบุไว้ในที่นี้กล่าวถึงการใช้@selector(localizedCaseInsensitiveCompare:) งานนี้เหมาะสำหรับอาร์เรย์ของ NSString อย่างไรก็ตามหากคุณต้องการขยายไปยังวัตถุประเภทอื่นและเรียงลำดับวัตถุเหล่านั้นตามคุณสมบัติ 'ชื่อ' คุณควรทำสิ่งนี้แทน:

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

วัตถุของคุณจะถูกจัดเรียงตามคุณสมบัติชื่อของวัตถุเหล่านั้น

หากคุณต้องการให้การเรียงลำดับไม่ตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณจะต้องตั้งค่า descriptor ดังนี้

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

14
+1 ขอบคุณ ตลกนี่เป็นกรณีการใช้งานทั่วไปมากกว่าคำตอบที่ยอมรับ
Vinay W

4
นี่จะเรียงตัวอักษรพิมพ์ใหญ่ก่อนแล้วตามด้วยตัวอักษรขนาดเล็ก
HarshIT

+1, ตัวบอกเรียงลำดับพร้อมกับตัวเลือกเป็นสิ่งที่ฉันต้องการและไม่มีคำตอบอื่นใด ขอบคุณมาก ๆ ชาย
Ganesh Somani

1
ฉันได้รับข้อผิดพลาดเมื่อฉันพยายามเรียงลำดับสตริงด้วยวิธีนี้เนื่องจากnameไม่ใช่รหัสที่ถูกต้อง ฉันจะใช้ปุ่มใดในการเรียงลำดับสตริงตามตัวอักษรด้วย NSSortDescriptor
temporary_user_name

27

วิธีที่มีประสิทธิภาพยิ่งขึ้นในการจัดเรียงรายการ NSString เพื่อใช้สิ่งต่าง ๆ เช่น NSNumericSearch:

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คุณสมบัติNSString ด้วยวิธีนี้:

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

1
ดูเหมือนจะไร้ประโยชน์เลย ไม่มีเหตุผลในการจัดเรียงสตริงด้วยวิธีนี้ (และอาจมีประสิทธิภาพการทำงานสำหรับการทำเช่นนั้น) และสำหรับวัตถุอื่น ๆ คุณสมบัติคำอธิบายของมันไม่ค่อยมีประโยชน์สำหรับการเรียงลำดับวัตถุประสงค์
mah

3

นี่มีคำตอบที่ดีสำหรับวัตถุประสงค์ส่วนใหญ่แล้ว แต่ฉันจะเพิ่มของฉันซึ่งเฉพาะเจาะจงมากขึ้น

ในภาษาอังกฤษโดยปกติเมื่อเราเรียงตามตัวอักษรเราจะไม่สนใจคำว่า "the" ในตอนต้นของวลี ดังนั้น "สหรัฐอเมริกา" จะถูกสั่งภายใต้ "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;
}

ฉันเพิ่งดูที่หลายปีต่อมาและฉันก็ตระหนักว่าควรมี "a" และ "an" ด้วย สิ่งเหล่านี้ควรเพิ่มได้ง่าย
Narco

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.