Как отключить NSDictionary Сортировка автоматически ключа
Когда я добавляю значения в NSMutableDictionary
, он автоматически устанавливает Key wise. Как я могу отключить его и организовать в соответствии с первым набором первых и вторых секунд.
NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary];
[filteredDictionary setObject:@"abc" forKey:@"1"];
[filteredDictionary setObject:@"abc" forKey:@"3"];
[filteredDictionary setObject:@"abc" forKey:@"2"];
[filteredDictionary setObject:@"abc" forKey:@"5"];
[filteredDictionary setObject:@"abc" forKey:@"4"];
NSLog(@"%@",filteredDictionary);
current output:
{
1 = abc;
2 = abc;
3 = abc;
4 = abc;
5 = abc;
}
but i want
{
1 = abc;
3 = abc;
2 = abc;
5 = abc;
4 = abc;
}
Есть ли способ отключить сортировку по ключевому слову?
Ответы
Ответ 1
Вот как это сделать:
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) {
if (obj1 > obj2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (obj1 < obj2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary];
for (NSString *index in sortedKeys) {
[orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index];
}
filteredDictionary = orderedDictionary;
Ответ 2
NSDictionary
не сортирует ваши ключи, порядок ключей в словаре не определен, так как это неупорядоченная коллекция.
Это означает, что вы не можете доверять порядку элементов, когда вы извлекаете/печатаете их, если вы не используете keysSortedByValueUsingSelector:
или keysSortedByValueUsingComparator:
, чтобы отсортировать их при извлечении их.
Вы также можете увидеть это в руководстве allKeys;
Возвращаемое значение
Новый массив, содержащий ключи словарей или пустой массив, если словарь не имеет записей.
Обсуждение
Порядок элементов в массиве не определен.
Невозможно сохранить ключи/значения, упорядоченные по своему желанию, в NSDictionary
, поэтому, если вам нужно их заказать в том же порядке, в котором они добавлены, у вас есть в основном два варианта:
- Добавьте их в/удалить из упорядоченного набора - например,
NSArray
- одновременно с добавлением их в NSDictionary
и используйте эту коллекцию для упорядоченного доступа.
- Добавьте поле к данным, которые вы добавляете в словарь, который подсчитывает для каждого добавления, затем используйте это поле с помощью
keysSortedByValueUsingComparator:
, чтобы заказать его при извлечении всех ключей из массива.
Ответ 3
NSDictionary
не предназначен для сортировки. Вы можете отсортировать его, получив все ключи с помощью allKeys
и отсортировав этот массив по своему вкусу. Затем пропустите этот массив и получите соответствующие значения.
Ответ 4
В NSDictionary
вы не получите данные при вставке.
Вы можете использовать массив, если хотите получить данные в соответствии с данными, которые вы вставляете,