2009-05-09 32 views
60

Tôi có một số NSArray và phải lặp lại nó trong trường hợp đặc biệt ngược, để tôi xem xét phần tử cuối cùng. Đó là vì lý do hiệu suất: Nếu cái cuối cùng không có ý nghĩa gì, tất cả những cái trước đó có thể bỏ qua. Vì vậy, tôi muốn phá vỡ vòng lặp. Nhưng điều đó sẽ không hiệu quả nếu tôi lặp lại từ 0 đến n. Tôi cần phải đi từ n đến 0. Có lẽ có một phương pháp hoặc chức năng tôi không biết về, vì vậy tôi sẽ không phải tái phát minh ra bánh xe ở đây.Có cách nào dễ dàng để lặp qua một NSArray ngược?

+4

"Làm cách nào để đảo ngược NSArray trong mục tiêu-C?" là một câu hỏi hoàn toàn khác. – Nestor

+0

Swift: http://stackoverflow.com/questions/24508592/how-to-iterate-for-loop-in-reverse-order-in-swift – Suragch

Trả lời

179

Để thêm vào các câu trả lời khác, bạn có thể sử dụng -[NSArray reverseObjectEnumerator] kết hợp với tính năng liệt kê nhanh trong Objective-C 2.0 (có sẵn trong Leopard, iPhone):

for (id someObject in [myArray reverseObjectEnumerator]) 
{ 
    // print some info 
    NSLog([someObject description]); 
} 

Nguồn với một số thông tin thêm: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

+0

Đây có phải là liệt kê nhanh hay không và nhanh hơn c thường xuyên cho vòng lặp bắt đầu từ '[myArray count] -1'? Làm thế nào để bạn lặp qua một 'NSString' ngược? – ma11hew28

+0

Tôi không có bất kỳ liên kết nào ở đây ngay bây giờ nhưng có video ở đâu đó (có thể là WWDC) nơi kỹ sư của Apple giải thích cách hoạt động của liệt kê nhanh và tại sao nó nhanh. Nó hoạt động tốt hơn cả bảng liệt kê NSArray dựa trên chỉ mục và các điều tra viên nền tảng kinh điển và, tùy thuộc vào kịch bản, bởi rất nhiều. –

+0

Tôi phải chạy ngược cho vòng lặp trên một từ điển, làm thế nào để làm như vậy? –

2
[NsArray reverseObjectEnumerator] 
12

Từ here:

NSEnumerator* myIterator = [myArray reverseObjectEnumerator]; 
id anObject; 

while(anObject = [myIterator nextObject]) 
{ 
    /* do something useful with anObject */ 
} 
16

Do đây là cho performace, bạn có một số tùy chọn và sẽ được tư vấn tốt để thử tất cả để xem cái nào phù hợp nhất.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array và sau đó lặp qua đó thường
  • Dùng C tiêu chuẩn cho vòng lặp và bắt đầu làm việc và ngược qua mảng.

phương pháp More cực (nếu hiệu suất là siêu tới hạn)

  • Đọc trên bao Cocoa thực hiện đối tượng nhanh chóng liệt kê và tạo ra tương đương của riêng bạn trong ngược lại.
  • Sử dụng mảng C hoặc C++.

Có thể có những người khác. Trong trường hợp đó, bất cứ ai cảm thấy tự do để thêm nó.

+1

Tôi sẽ nói rằng enumerateObjectsWithOptions: NSEnumerationReverse là câu trả lời hay nhất, đặc biệt nếu bạn cần biết bạn đang ở chỉ mục nào. Cảm ơn!!! –

0
for (int i = ((int)[array count] - 1); i > -1; i--) { 
    NSLog(@"element: %@",array[i]); 
} 
Các vấn đề liên quan