2010-07-08 25 views
45

Tôi đang cố gắng để làm cho một bảng điểm số cao, và hút tại mảng trong mục tiêu c (thực sự, trong mục tiêu chung c là thách thức đối với tôi), vì vậy tôi không thể tìm ra cách để sắp xếp. Tôi đang cố gắng làm một cái gì đó như thế này (speudocode, tôi đang viết điều này theo phong cách ActionScript bởi vì tôi cảm thấy thoải mái hơn với nó):Làm cách nào để sắp xếp một mảng NSMutable với NSNumbers trong đó?

highscores.addObjecttoArray(score) 
highscores.sort(ascending) 

Nhưng tôi không thể tìm ra ... Tôi ' đã nhìn thấy các chủ đề khác về nó, nhưng sử dụng các tập tin plist của họ và các công cụ và tôi không biết đủ mục tiêu c để học hỏi từ họ.

+0

Bạn nên đọc các chủ đề NSPredicate và Predicate Programming. Việc hiểu các biến vị ngữ làm cho mọi thứ trở nên dễ dàng hơn trong Obj-c nhưng nó không phải là thứ mà hầu hết các tài nguyên đào tạo ban đầu dành cho bất kỳ thời điểm nào. – TechZen

+1

@TechZen, tôi nghĩ bạn có nghĩa là NSSortDescriptior? – ohhorob

+0

Ah, vâng. Não của tôi nhấn mạnh vào việc chuyển đổi NSSortDescriptior và NSPredicate khoảng một nửa thời gian. Vẫn còn lời khuyên của tôi là âm thanh nếu tắt chủ đề. – TechZen

Trả lời

133

Bạn có muốn làm điều đó một cách ngắn?

Nếu bạn có một mảng có thể thay đổi các NSNumber trường hợp:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; 
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]]; 

đẹp và dễ dàng :)

Bạn cũng có thể thực hiện phân loại tương tự với mô tả về mảng bất biến, nhưng bạn sẽ kết thúc với một bản sao , thay vì phân loại tại chỗ.

+11

+1 cho tên biến cao nhấtToLowest – cocoafan

+0

Em bé đẹp và dễ dàng;) – Abo3atef

+1

Để làm rõ (và tối ưu hóa): 'NSSortDescriptor * higherToLowest = [NSSortDescriptor sortDescriptorWithKey: @" self "tăng dần: NO]; NSArray * sortArray = [mutArray sortArrayUsingDescriptors: @ [higherToLowest]]; ' – mylogon

26

[highscores sortUsingSelector:@selector(compare:)];

nên tác dụng nếu thiếu chắc chắn tất cả NSNumber s.

(Thêm một đối tượng là:

[highscores addObject:score];

)

Nếu bạn muốn sắp xếp giảm dần (cao nhất đầu tiên):

10,6/iOS 4:

[highscores sortUsingComparator:^(id obj1, id obj2) { 
    if (obj1 > obj2) 
     return NSOrderedAscending; 
    else if (obj1 < obj2) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
}]; 

Nếu không, bạn có thể xác định phương pháp danh mục, ví dụ:

@interface NSNumber (CustomSorting) 

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber; 

@end 

@implementation NSMutableArray (CustomSorting) 

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber { 
    return [otherNumber compare:self]; 
} 

@end 

Và gọi nó là:

[highscores sortUsingSelector:@selector(reverseCompare:)];

+0

Tôi sẽ giv này một thử, cảm ơn. – meman32

+0

Ok, vấn đề nhỏ, tôi nghĩ thats phân loại nó một cách sai lầm ... Là của họ anyway để chuyển đổi xung quanh? – meman32

+0

bạn có nghĩa là tăng dần và giảm dần? – vodkhang

3

Tôi đã thử câu trả lời do ohhorob cung cấp, nhưng các đối tượng vẫn đang được sắp xếp theo thứ tự abc. Sau đó, tôi chạy qua câu trả lời này trong một câu trả lời khác (https://stackoverflow.com/a/4550451/823356):

Tôi đã thay đổi NSSortDescriptor của mình và bây giờ sắp xếp số lượng.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score" 
               ascending:YES 
               comparator:^(id obj1, id obj2) { 
    return [obj1 compare:obj2 options:NSNumericSearch]; 
}]; 

Tôi chỉ nghĩ rằng tôi muốn thả này ở đây vì nó giải quyết 'sắp xếp theo bảng chữ cái của NSNumbers' của tôi vấn đề

0

Mã này sẽ sắp xếp một NSMutableArray của NSNumber thứ tự tăng dần:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 

Mã này sẽ sắp xếp NSMutableArray của NSNumber theo thứ tự giảm dần:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2] * -1; // reverse the enum 
}]; 

Mã sử ​​dụng thực tế là phương thức so sánh NSNumber trả về một NSComparisonResult trong khoảng từ 1 đến 1.Nhân kết quả của phép so sánh bằng -1 đảo ngược kết quả và do đó đảo ngược sắp xếp theo thứ tự giảm dần.

+0

hoặc bạn có thể thay đổi '[obj1 compare: obj2]' với '[n2 so sánh: n1]' –

-1

Đối Giảm dần thứ tự:

NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors: 
           @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                   ascending:NO]]]; 

Đối tăng dần theo thứ tự

NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors: 
           @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                   ascending:YES]]]; 
1

khoảng cách là chìa khóa và nó liên kết giá trị (float hoặc double)

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance" 
ascending:YES 
comparator:^(id obj1, id obj2) 
        { 
        return [obj1 compare:obj2 options:NSNumericSearch]; 
        }]; 
NSArray *myArray = [NSArray arrayWithArray:arraySubCat]; 
myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]]; 
arraySubCat = [myArray copy]; 
1

Đối với tất cả đó là giá trị, đây là một phương pháp viết tắt khác:

NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5]; 

NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { 
      return [n1 compare:n2]; 
     }]; 
NSLog(@"Ascending: %@", asc); 

NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { 
      return [n2 compare:n1]; 
     }]; 
NSLog(@"Descending: %@", dec); 
Các vấn đề liên quan