2013-10-27 16 views

Trả lời

7
NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array2]; 

    NSMutableArray *dictArray = [NSMutableArray array]; 
    [countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
     [dictArray addObject:@{@"object": obj, 
           @"count": @([countedSet countForObject:obj])}]; 
    }]; 

    NSLog(@"Objects sorted by count: %@", [dictArray sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]]); 

Trong đoạn mã trên, array2 là một mảng của 100 chuỗi ngẫu nhiên, đều có hai chữ cái. sortedArrayUsingDescriptors:, trả về một mảng đã sắp xếp, trong trường hợp này, nó được sắp xếp theo thứ tự giảm dần theo số lượng đối tượng.

7

Đây là một cách khác để đạt được kết quả tương tự:

NSArray *sortedValues = [countedSet.allObjects sortedArrayUsingComparator:^(id obj1, id obj2) { 
    NSUInteger n = [countedSet countForObject:obj1]; 
    NSUInteger m = [countedSet countForObject:obj2]; 
    return (n <= m)? (n < m)? NSOrderedAscending : NSOrderedSame : NSOrderedDescending; 
}]; 

Để có được các giá trị để bạn có thể sử dụng giảm dần (hoặc ngược lại giá trị trả về ở trên).

sortedValues.reverseObjectEnumerator.allObjects 
+2

Nếu bạn thay đổi 'return (n <= m)? (n Filowk

+0

Đây là một câu trả lời hay nhưng tôi thích sử dụng các trường hợp 'NSNumber' cho mỗi giá trị countForObject và sau đó chỉ trả lại kết quả' so sánh' cho những giá trị đó. –

1

Đây là một phiên bản Swift:

let sorted = countedSet.allObjects.sort { return countedSet.countForObject($0.0) < countedSet.countForObject($0.1) } 

Chỉ cần thay đổi <-> cho đơn đặt hàng

2

giảm dần Ví Swift3 bạn cần phải sửa đổi mã nhanh chóng cung cấp một chút:

let countedSet = [1,2,2,4,6,7,8,8,5,8,1] 

let sorted = countedSet.allObjects.sorted { return countedSet.count(for: $0.0) > countedSet.count(for: $0.1) } 

// iterate over all items in the set 
for item in countedSet { 
    print("\(item): Count - \(countedSet.count(for: item))") 
} 
+1

Có gì với tham chiếu 'túi'? Bạn có thể làm rõ? – Adrian

+0

Xin lỗi, tôi đã thử nghiệm mã với các tên biến khác và đổi tên thành biến sai ;-) Nó đã điều chỉnh mã. Cảm ơn bạn! – Lepidopteron

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