iPhone - получение уникальных значений от объекта NSArray

С точки зрения сжатия и теории информации, энтропия источника является средним объемом информации (в битах), что символы из источника могут передать. Неофициально разговор, чем более маловероятен символ, тем больше удивления его появление приносит.

, Если Ваш источник имеет два символа, скажите A и B, и они одинаково вероятны, затем каждый символ передает тот же объем информации (один бит). Источник с четырьмя одинаково вероятными символами передает два бита за символ.

Для более интересного примера, если Ваш источник имеет три символа, A, B, и C, где первые два вдвое более вероятны, чем третье, затем третье более удивительно, но также менее вероятно. Существует сетевая энтропия 1,52 для этого источника, как вычислено ниже.

Вы вычисляете энтропию как "среднее удивление", где "удивление" для каждого символа является своими временами вероятности отрицательный двоичный журнал вероятности:

                            binary
symbol  weight  probability   log    surprise
  A        2        0.4      -1.32    0.53
  B        2        0.4      -1.32    0.53
  C        1        0.2      -2.32    0.46
total      5        1.0               1.52

отрицание двоичного журнала используется (конечно), потому что журналы значений между 0 и 1 (эксклюзивный) отрицательны.

55
задан Girish 7 June 2013 в 11:52
поделиться

2 ответа

Совершенно простой однострочный вкладыш:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];

Уловка заключается в методе valueForKey: из NSArray . Это выполнит итерацию по вашему массиву ( myArrayOfCustomObjects ), вызовет метод -state для каждого объекта и построит массив результатов. Затем мы создаем NSSet с результирующим массивом состояний для удаления дубликатов.


Начиная с iOS 5 и OS X 10.7, есть новый класс, который также может это делать: NSOrderedSet . Преимущество упорядоченного набора состоит в том, что он удаляет любые дубликаты, но также поддерживает относительный порядок.

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
122
ответ дан 26 November 2019 в 17:33
поделиться

Взгляните на keypaths . Они очень мощные, и большую часть времени я использую их вместо классов NSPredicate. Вот как вы бы использовали их в своем примере ...

NSArray *uniqueStates;
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];

Обратите внимание на использование valueForKeyPath вместо valueForKey .

Вот более подробный / надуманный пример .. .

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil];
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil];
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil];
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil];

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil];

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]);

// OUTPUT
// Unique States:
// "california",
// "michigan",
// "new york"
136
ответ дан 26 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: