2013-06-18 33 views
5

Tôi có một mảng chứa đối tượng tùy chỉnh với thuộc tính có tên là seat. Ghế có thể có giá trị 1A, 1D, 1C, 1k, 2A, 2k, 2D, 2C.Làm cách nào để sắp xếp một mảng các đối tượng tùy chỉnh trên thuộc tính này?

Bây giờ chúng có thể được sắp xếp theo thứ tự bất kỳ, và tôi muốn sắp xếp chúng theo lớp, tuy nhiên sắp xếp chỉ chiếm ghế giá trị số và không A, C, D, hoặc K.

Tôi muốn thứ tự là 1A, 1C, 1D, 1K và cứ thế.

Đây là những gì tôi đã thực hiện trong đối tượng SeatDO:

-(NSComparisonResult) compareBySeatNumber:(SeatDO*)other { 
    NSComparisonResult result = NSOrderedSame; 
    NSInteger seatNumber = [self.seat integerValue]; 
    NSInteger otherSeatNumber = [other.seat integerValue]; 

    if (seatNumber > otherSeatNumber) { 
     result = NSOrderedDescending; 
    } else if (seatNumber < otherSeatNumber) { 
     result = NSOrderedAscending; 
    } 
    return result; 
} 

Làm thế nào để làm cho nó xem xét các chữ cái cũng ..?

+0

'Ghế' có được thực hiện dưới dạng enum không? Nếu không, loại đối tượng nào là giá trị của 'ghế'? – makaron

+0

@makaron ghế là nsstring –

+3

Vâng, sau đó câu trả lời của Gabriele nên làm việc) – makaron

Trả lời

7

Giả sử bạn chuyển đổi các số ghế để NSString s

NSArray *sortedSeats = [seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

nên thực hiện thủ thuật. Sắp xếp các chuỗi sẽ tự nhiên theo thứ tự sắp xếp bạn cần.

Nếu không, bạn chỉ có thể sử dụng chuỗi trong sự so sánh với

[seats sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [[obj1 stringValue] localizedStandardCompare:[obj2 stringValue]]; 
}]; 

Tôi cho rằng stringValue có sẵn cho bạn đối tượng tùy chỉnh. Nếu không, chỉ cần thay thế bằng bất kỳ thứ gì sẽ trả lại mô tả NSString về các phiên bản của bạn.

LƯU Ý

Theo đề nghị của Alladinian, bạn muốn sử dụng localizedStandardCompare: như trái ngược với caseInsensitiveCompare:, để các có được thứ tự tự từ điển thích hợp.

+0

+1. Sử dụng NSString. Nó sẽ giúp bạn tiết kiệm thời gian và công sức. – rdurand

+0

Điều này sẽ giới thiệu một vấn đề với một chỗ ngồi như "10D" hoặc "01C" ví dụ ... – Alladinian

+1

Xin chào Gabriele (thanx cho fairplay bằng cách này, đây là những gì làm cho cộng đồng này rất tuyệt vời).Vì câu trả lời của bạn đã được chọn là chính xác, bạn có thể muốn sửa chữa một lỗi nhỏ: 'formattedArrayUsingSelect:' nên được 'sortArrayUsingSelector:' – Alladinian

-2

nếu bạn đang sử dụng một NSArray bạn có thể sắp xếp nó bằng cách sử sortedArrayUsingSelector: (SEL) so sánh và nó sẽ đưa bạn trở mảng khác được sắp xếp

NSArray *arraySorted = [myArray sortedArrayUsingSelector:@selector(compareBySeatNumber:)]; 
+0

Có vẻ như bạn không nhận được câu hỏi của tôi .. Tôi biết làm thế nào để có được sắp xếp mảng, nhưng cơ chế phân loại không tài khoản cho các chữ cái trong chỗ ngồi. chỉ các số. –

+0

Người dùng muốn biết cách ghi nhận ** cũng là ký tự ** khi sắp xếp, không phải cách sắp xếp một mảng –

+0

Hơn nữa 'sortArrayUsingSelector' sẽ gửi bộ chọn cho mỗi đối tượng được tổ chức bởi mảng, mà tất nhiên không trả lời tới 'compareBySeatNumber:'. Đoạn mã trên sẽ làm hỏng ứng dụng. –

3

Sử dụng localizedStandardCompare: như bộ chọn (Finder giống như phân loại)

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

Trong khi caseInsensitiveCompare: có vẻ như đúng, nếu bạn thêm một @"10D" hoặc @"01C" ghế nó sẽ xuất hiện ở phía trước của tất cả những người khác ...

+0

thanks ...... :) –

+0

Bạn được chào đón :) – Alladinian

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