2011-11-08 48 views
18

Tôi cần tạo một mảng được sắp xếp là NSNumber s từ một số khác NSArray. Tôi muốn sử dụng phương thức sortedArrayUsingComparator:. Tôi tìm thấy ví dụ này trong tài liệu của Apple:Thay đổi thứ tự sắp xếp của - [NSArray sortArrayUsingComparator:]

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 

Ở đây tôi chỉ cung cấp bộ so sánh trong một khối. Bản thân sắp xếp - bit bị ẩn khỏi tôi, sử dụng khối này - dường như đang tăng dần.

Tôi muốn biết nếu tôi có thể yêu cầu một thứ tự sắp xếp khác nhau bên ngoài để khối này, hay tôi chỉ cần lật <> 's (hoặc NSOrderedXXX' s) xung quanh?

Trả lời

24

Nếu bạn muốn sắp xếp giảm dần, sau đó chỉ cần lật so sánh (hoặc lật các NSComparisonResult s). Không cần phải làm nổi bật API bằng cách có thông số ascending: khi bạn có thể kiểm soát điều đó trong khối trực tiếp.

4

Chỉ cần thay đổi logic:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 

if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
} 

if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
} 
return (NSComparisonResult)NSOrderedSame; 
}]; 

Để rõ ràng nó có thể là tốt nhất để làm điều này một phương thức với một tên tương tự như: decendingSort.

+1

Tất nhiên điều này là tốt, nhưng trừ khi bạn trang trí nó với màu cam Các bình luận về hình nón-nón được viết bằng mực đỏ-Chúa Giêsu-Christ nói rằng bạn đã lật qua trật tự xung quanh, vào một thời điểm nào đó sau này, đây có thể là một cơn ác mộng tiềm ẩn. Xây dựng trình mô tả sắp xếp sẽ có ý nghĩa hơn và tự nhận xét trừ khi hiệu suất sẽ có ảnh hưởng nghiêm trọng. –

+0

@God Mô tả sắp xếp có vẻ tuyệt vời, vui lòng cung cấp ví dụ triển khai để so sánh. – zaph

4

Từ tài liệu cho -sortedArrayUsingComparator::

"Trả về một mảng liệt kê các yếu tố mảng nhận của thứ tự tăng dần, được xác định theo phương pháp so sánh xác định bởi một NSComparator Khối nhất định."

Vì vậy, Bạn sẽ phải nghỉ mát để sử dụng

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

nhưng tất nhiên điều đó có nghĩa là cán NSSortDescriptor của riêng bạn đối tượng đầu tiên, có thể phù hợp với mục đích của bạn tốt.

+0

+1 để chỉ ra rằng đây là, trên thực tế, tài liệu. Chúc mừng Jeff. –

4

Bạn có thể lật các toán tử xung quanh.

"bit bị ẩn khỏi bạn" không quan tâm đến tăng dần hoặc giảm dần vì không biết gì về đối tượng của bạn. Nó giống như yêu cầu đồng nghiệp của bạn nếu một quả bóng khúc côn cầu lớn hơn hoặc ít hơn một xạ thủ. Việc thực hiện nội bộ chỉ sử dụng thuật toán sắp xếp (có thể được xác định bằng cách sử dụng kích thước mảng của bạn) và sử dụng chức năng khối của bạn để so sánh hai đối tượng.

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