2013-10-27 12 views

Odpowiedz

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]]]); 

W powyższym kodzie array2 jest tablicą 100 ciągi, każdy z dwoma literami. sortedArrayUsingDescriptors:, zwraca posortowaną tablicę, w tym przypadku jest posortowana w porządku malejącym według liczby obiektów.

7

Oto kolejny sposób, aby osiągnąć ten sam rezultat:

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; 
}]; 

aby uzyskać wartości w porządku malejącym można używać (lub odwrócenia powyższej wartości zwracanej).

sortedValues.reverseObjectEnumerator.allObjects 
+2

Jeśli zmienisz 'return (n <= m)? (n Filowk

+0

To jest dobra odpowiedź, ale ja wolę używać instancji 'NSNumber' dla każdej z wartości countForObject, a następnie zwracam wynik' compare' dla nich. –

1

Oto Swift wersja:

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

Wystarczy zmienić < do > na zamówienie

2

malejąco Dla Swift3 trzeba zmodyfikować Dostarczony kod SWIFT trochę:

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

Co się dzieje z referencją 'bag'? Możesz wyjaśnić? – Adrian

+0

Przepraszam, przetestowałem kod z innymi nazwami zmiennych i zmieniono nazwę zmiennej ;-) Dostosował kod. Dziękuję Ci! – Lepidopteron

Powiązane problemy