NSMutableDictionary, отличается печать от консоли и кода - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть вопрос по NSMutableDictionary. Я читал, что они являются лишь оболочкой для хэш-карты, поэтому их использование в упорядоченном списке не рекомендуется.

Но я должен его использовать, поэтому начались проблемы ...

Я сохраняю результат Json (после обращения к URL) в NSMutableDictionary, а затем у меня есть два разных «print»:

  • если я пытаюсь распечатать словарь из консоли с помощью команды "po myDictionary", у меня есть порядок (порядок оригинального json)
  • Если я создаю простое «для утверждения» и печатаю все элементы в myDictionary, у меня будет другой порядок.

Как это возможно? Разве они не должны иметь одинаковый порядок?

Спасибо всем!

РЕДАКТИРОВАТЬ: это небольшой пример кода:

NSMutableDictionary *myDictionary = [--{RECEIVED FROM ANOTHER CALL}--];
NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]];

for(NSString *key in myDictionary) {
    NSLog(@"%@", key);

    NSObject *object = [[NSObject alloc] init]

    /* some operation in the code with object */

    [tmp setObject:object forKey:key];
}

После «для утверждения» вот что произошло:

  • если я вижу все журналы, я что-то получаю (например, если myDictionary имеет название дня, когда у меня есть что-то вроде "суббота, понедельник, пятница .....")
  • если я вставлю здесь точку останова и попытаюсь напечатать что-нибудь из консоли с помощью команды "po myDictionary", у меня будет другой порядок, ("воскресенье, вторник, понедельник, ...")

Вопрос: почему?

РЕДАКТИРОВАТЬ 2: Я знаю, что существует система с "OrderedDictionary", но это не вопрос: Я хочу понять, почему у меня есть две разные печати , один из "для оператор "и другой из" по команде ".

Ответы [ 4 ]

5 голосов
/ 02 декабря 2011

Команда po <object> в gdb печатает вывод [<object> description]. [NSDictionary description] сортирует вывод по ключу. Это задокументированное поведение .

Если ваш JSON отсортирован по ключу (который звучит так, как он есть), то вы можете просто отсортировать по ключу еще раз, чтобы обеспечить надежный заказ.

Обратите внимание, что если ваш JSON использует объект (набор пар ключ / значение) для представления упорядоченных данных, это нарушает спецификацию JSON .

Объект - это неупорядоченный набор из нуля или более пар имя / значение, где имя - это строка, а значение - строка, число, логическое значение, ноль, объект или массив.

Правильная кодировка - это массив одноключевых объектов, таких как:

[ { "firstKey": "value" }, { "secondKey": "value" } ]

Но если вы можете использовать отсортированные ключи для определения порядка, это уместно.

2 голосов
/ 02 декабря 2011

NS (изменяемые) Словари не упорядочены, точка.(Это не просто обескураживает.) Нет гарантии, что даже если вы получите «оригинальный порядок», который обеспечивает po, он останется таким же от запуска приложения до запуска приложения, или от версии ОС до версии ОС, или от аппаратного обеспечения.на оборудование.Не делайте этого.

Может быть, вы хотите использовать что-то вроде http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html?

2 голосов
/ 02 декабря 2011

Hashmap не имеет порядка ключей или значений , и не обещает никаких заказов. Если вам нужен тот же порядок, вы можете использовать массив пар ключ-значение или использовать http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html.

1 голос
/ 02 декабря 2011

Вы можете предпочесть заказанный словарь: http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html

Хорошо, теперь вы изменили свой оригинальный вопрос.Теперь вы спрашиваете:

Я знаю, что существует система с «OrderedDictionary», но это не вопрос: я хочу понять, почему у меня два разных отпечатка, один из которых"for Statement" и другой из "po command".

Это потому, что это два совершенно разных способа доступа к данным.Оператор for перемещает ключи один за другим в некотором порядке.Команда po вызывает метод словаря description, который явно не состоит из оператора for, перечисляющего ключи, подобные вашему.Я не понимаю, почему вы находите это загадочным.

...