2009-12-04 42 views
28

Tôi có câu hỏi về cách phân loại NSMutableArray. Tôi có thể sử dụng phương pháp sortedArrayUsingDescriptors: để sắp xếp một mảng với các đối tượng.Làm thế nào để sắp xếp NSMutableArray bằng cách sử dụng sortArrayUsingDescriptors?

Ví dụ tôi có một NSMutableArray của places nơi tôi có một thuộc tính frequency (int value) và tôi muốn sắp xếp giảm dần trên frequency nhưng tôi không biết làm thế nào để sử dụng nó một cách chính xác.

Tôi phải đặt điều gì làm khóa trong initWithKey?

đối tượng My place chứa:

NSString * name; 
NSString * address; 
NSString * frequency; 
NSString * type; 

NSMutableArray * places; 

... populate array with objects ... 

NSSortDescriptor * sortByFrequency = 
    [[[NSSortDescriptor alloc] initWithKey:@"????????" ascending:NO] autorelease]; 

NSArray * descriptors = [NSArray arrayWithObject:sortByFrequency]; 
NSArray * sorted = [x sortedArrayUsingDescriptors:descriptors]; 
+6

Argh! Điều này thật khó hiểu. Xin vui lòng, babyDeveloper, sử dụng dấu chấm câu (chủ yếu là dấu chấm và dấu phẩy) trong câu hỏi của bạn. – pmg

+3

Bạn nói "frecuency" này là giá trị int, nhưng mã của bạn cho biết đó là một NSString. Hãy cẩn thận để cụm từ câu hỏi của bạn rõ ràng. – Chuck

Trả lời

1

Dưới đây là làm thế nào một sẽ sắp xếp một NSMutableArray:

NSMutableArray *numberSort =[[NSMutableArray alloc] init]; 

    while ((key = [enumerator nextObject])) { 
     //(NSNumber *)integer = [key integerValue]; 
     [numberSort addObject:[NSNumber numberWithInt:[key intValue]]]; 
     // code that uses the returned key 
    } 


    NSArray *stringSort = [numberSort sortedArrayUsingSelector:@selector(compare:)]; 
    enumerator = [stringSort objectEnumerator]; 
    NSNumber *intKey; 

    NSMutableArray *backToString =[[NSMutableArray alloc] init]; 

    while ((intKey = [enumerator nextObject])) { 
     //(NSNumber *)integer = [key integerValue]; 
     [backToString addObject:[intKey stringValue]]; 
     // code that uses the returned key 
2

Các "chìa khóa" là một phương pháp của các đối tượng của bạn (các phần tử của mảng "x") trả về thứ bạn muốn sắp xếp theo. Vì vậy, trong trường hợp này, bạn nói rằng bạn muốn sắp xếp theo "tần số". Sau đó, tất cả những gì bạn phải làm là sử dụng tên của phương thức trả về tần số, làm khóa.

+0

Mặc dù nó sẽ phải là một kiểu số, chẳng hạn như 'int' (tốt hơn là 'unsigned'),' NSUInteger', 'double', hoặc' NSNumber * '. Với các giá trị tần số như chuỗi, chúng sẽ không sắp xếp theo số (không phải không có bộ so sánh tùy chỉnh). –

110

Để sắp xếp mảng của các đối tượng bạn:

  1. thiết lập NSSortDescriptor - tên sử dụng các biến của bạn như là chìa khóa để mô tả thiết lập để phân loại cộng với bộ chọn được thực hiện trên những phím
  2. nhận được hàng loạt các mô tả sử dụng NSSortDescriptor mà bạn đã thiết lập
  3. loại mảng của bạn dựa trên những mô tả

Dưới đây là hai ví dụ, một sử dụng Các giá trị NSDictionaryNSString/NSNumber sắp xếp theo số NSNumber, một giá trị khác sử dụng lớp tùy chỉnh với phân loại trên hai trường NSString.

Làm theo Sorting and Filtering NSArray Objects trong chủ đề lập trình ca cao để xem thêm ví dụ và giải thích.

Ví dụ:

này được thực hiện trên GNUStep nó sẽ làm việc như nhau trên Cocoa - mã là giống hệt nhau - Tôi sẽ cố gắng khi tôi ngồi trước máy Mac của tôi:

dụ đầu tiên sử dụng NSStringNSNumber giá trị với sắp xếp trên NSNumber giá trị:

NSString * NAME  = @"name"; 
NSString * ADDRESS = @"address"; 
NSString * FREQUENCY = @"frequency"; 
NSString * TYPE  = @"type"; 

NSMutableArray * array = [NSMutableArray array]; 

NSDictionary * dict; 

dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      @"Alehandro", NAME, @"Sydney", ADDRESS, 
      [NSNumber numberWithInt:100], FREQUENCY, 
      @"T", TYPE, nil]; 
[array addObject:dict]; 

dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      @"Xentro", NAME, @"Melbourne", ADDRESS, 
      [NSNumber numberWithInt:50], FREQUENCY, 
      @"X", TYPE, nil]; 
[array addObject:dict]; 

dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      @"John", NAME, @"Perth", ADDRESS, 
      [NSNumber numberWithInt:75], 
      FREQUENCY, @"A", TYPE, nil]; 
[array addObject:dict]; 

dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      @"Fjord", NAME, @"Brisbane", ADDRESS, 
      [NSNumber numberWithInt:20], FREQUENCY, 
      @"B", TYPE, nil]; 
[array addObject:dict]; 

Phân loại phần sử dụng mô tả với lĩnh vực tần số đó là NSNumber:

NSSortDescriptor * frequencyDescriptor = 
    [[[NSSortDescriptor alloc] initWithKey:FREQUENCY 
           ascending:YES] autorelease]; 

id obj; 
NSEnumerator * enumerator = [array objectEnumerator]; 
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); 

NSArray * descriptors = 
    [NSArray arrayWithObjects:frequencyDescriptor, nil]; 
NSArray * sortedArray = 
    [array sortedArrayUsingDescriptors:descriptors]; 

NSLog(@"\nSorted ..."); 

enumerator = [sortedArray objectEnumerator]; 
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); 

OUTPUT - sắp xếp theo lĩnh vực Tần số:

2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; } 
2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; } 
2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; } 
2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; } 
2009-12-04 x[1] 
Sorted ... 
2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; } 
2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; } 
2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; } 
2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; } 


Ví dụ thứ hai với lớp tùy chỉnh và phân loại trên hai biến số NSString.

mảng để sắp xếp (xem lớp A ở phía dưới):

NSMutableArray * array = [NSMutableArray array]; 
[array addObject:[[A alloc] initWithFirstName:@"Alehandro" 
            lastName:@"Xentro" 
              age:[NSNumber numberWithInt:40]]]; 
[array addObject:[[A alloc] initWithFirstName:@"John" 
            lastName:@"Smith" 
              age:[NSNumber numberWithInt:30]]]; 
[array addObject:[[A alloc] initWithFirstName:@"John" 
            lastName:@"Smyth" 
              age:[NSNumber numberWithInt:25]]]; 
[array addObject:[[A alloc] initWithFirstName:@"Torro" 
            lastName:@"Ola" 
              age:[NSNumber numberWithInt:45]]]; 
[array addObject:[[A alloc] initWithFirstName:@"Alehandro" 
            lastName:@"Bento" 
              age:[NSNumber numberWithInt:41]]]; 
[array addObject:[[A alloc] initWithFirstName:@"Alehandro" 
            lastName:@"Axel" 
              age:[NSNumber numberWithInt:41]]]; 

Phần phân loại, sắp xếp trên lastName sau đó firstName:

NSString * LASTNAME = @"lastName"; 
NSString * FIRSTNAME = @"firstName"; 

NSSortDescriptor *lastDescriptor = 
    [[[NSSortDescriptor alloc] 
     initWithKey:LASTNAME 
      ascending:YES 
      selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; 

NSSortDescriptor *firstDescriptor = 
    [[[NSSortDescriptor alloc] 
     initWithKey:FIRSTNAME 
      ascending:YES 
      selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; 

NSArray * descriptors = 
    [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil]; 
NSArray * sortedArray = 
    [array sortedArrayUsingDescriptors:descriptors]; 

In kết quả :

NSLog(@"\nSorted ..."); 

enumerator = [sortedArray objectEnumerator]; 
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); 

quả (trước và sau khi phân loại):

2009-12-04 00:52:16.637 x[11375] Alehandro, Xentro, age:40 
2009-12-04 00:52:16.644 x[11375] John, Smith, age:30 
2009-12-04 00:52:16.644 x[11375] John, Smyth, age:25 
2009-12-04 00:52:16.644 x[11375] Torro, Ola, age:45 
2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41 
2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41 
2009-12-04 00:52:16.645 x[11375] 
Sorted ... 
2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41 
2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41 
2009-12-04 00:52:16.645 x[11375] Torro, Ola, age:45 
2009-12-04 00:52:16.645 x[11375] John, Smith, age:30 
2009-12-04 00:52:16.645 x[11375] John, Smyth, age:25 
2009-12-04 00:52:16.645 x[11375] Alehandro, Xentro, age:40 

Lớp A kéo dài NSObject - không có gì đặc biệt ở đây:

#import <Foundation/Foundation.h> 

@interface A : NSObject 
{ 
    NSString * firstName; 
    NSString * lastName; 
    NSNumber * age; 
} 

- (id)initWithFirstName:(NSString*)aFirstName 
       lastName:(NSString*)aLastName 
        age:(NSNumber*)anAge; 

-(NSString*)description; 
+(NSString*)action; 

@end 

Thực hiện:

#import <Foundation/Foundation.h> 
#import "A.h" 

@implementation A 

- (id)init 
{ 
    return [self initWithFirstName:@"N/A" 
          lastName:@"N/A" 
           age:0]; 
} 

- (id)initWithFirstName:(NSString*)aFirstName 
       lastName:(NSString*)aLastName 
        age:(NSNumber*)anAge 
{ 
    self = [super init]; 
    if (!self) return nil; 

    firstName = [aFirstName copy]; 
    lastName = [aLastName copy]; 
    age = [anAge copy]; 

    return self; 
} 

- (void)dealloc 
{ 
    [firstName release]; 
    [lastName release]; 
    [age release]; 
    [super release]; 
} 

- (NSString *) description 
{ 
    return [NSString stringWithFormat: @"%@, %@, age:%@", 
             firstName, lastName, age]; 
} 
@end 
+10

Cảm ơn bạn đã trả lời chi tiết như vậy! – DonnaLea

+1

Cảm ơn bạn stefanB.Cảm ơn rất nhiều :) –

+0

+1, Cảm ơn câu trả lời rất mô tả :) đã giúp tôi rất nhiều: D – mAc

Các vấn đề liên quan