Предотвращение дублирования NSArrays (один отсортированный, один несортированный) - PullRequest
1 голос
/ 21 ноября 2010

У меня есть NSArray объектов, он неупорядочен.Он обновлен из Интернета, поэтому я не могу заказать его один раз и гарантировать его заказ позже.

Каждый элемент соответствует ячейке табличного представления, но пользователь может изменить их порядок, и в виде таблицы есть 2 раздела, хотя для начала все ячейки находятся в одном разделе.

ИтакЯ мог бы создать дубликат NSArray и заказать его.И сохраните его на жесткий диск.Но это кажется довольно пустой тратой, и что мне делать, когда новый объект добавляется / удаляется из неупорядоченного NSArray с помощью обновления через Интернет.

Итак, всего:

  • Как мне получить один неупорядоченный массив NSArray и один заказанный без дублирования (и растраты памяти)?

  • И как мне обращаться с обновлениями неупорядоченного массива, когда пользовательне установил местоположение для новых объектов / ячеек?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Ваш вопрос не очень понятен:

  • Массивы - это "упорядоченная коллекция" по определению (кроме странных языков с "ассоциативными массивами").
  • «Порядок» - это не то же самое, что «сортировка».[1, 2, 3] отсортировано;[1, 3, 2] не отсортировано, но упорядочено (в предположении обычного компаратора).
  • «Предотвращение дублирования NSArrays» - бесполезная тема.

Итак, я 'Вам нужно будет угадать, что вы пытаетесь сказать:

  • У вас есть список вещей, которые вы загружаете из Интернета.
  • Вы время от времени обновляете список загруженных вещей.
  • Пользователь может изменить порядок списка.
  • Вы хотите иметь возможность обновлять список вещей, но сохранить порядок пользователя.

Ну, сначала вам нужнокакой-то способ выяснить, какие элементы в двух списках "эквивалентны".Например, первый список - [Apple, Banana, Orange], и ​​пользователь размещает его в порядке предпочтения сока [Orange, Apple, Banana].Если второй список [яблоко, банан, апельсин] (поскольку вы решили, что все должно быть в нижнем регистре, а вещи, которые должны быть написаны заглавными буквами, можно сделать с помощью -[NSString capitalizedString] или чего-либо еще), вам нужен способ определить, что Apple =apple и создание нового списка [апельсин, яблоко, банан].

Непонятно, почему вы думаете, что вам нужно сохранить исходный список - да, это означает, что вы можете просто сказать: «Apple и яблоко оба виндекс 0, так что они одинаковы ", но это также означает, что вы никогда не сможете изменить порядок по умолчанию, и вы никогда не сможете удалить элемент (вы можете заменить его заполнителем, но не ме).

Есть два простых решения:

  • Храните список индексов (например, вы бы сохранили [2, 0, 1], потому что Orange имеет индекс 2 и т. Д.).Это немного боли.Если вы хотите использовать NSArray, самый простой способ - обернуть вещи в NSNumber.
  • Не обращайте внимания на исходный порядок.Допустим, у вас есть «заказанный пользователем» список [Orange, Apple, Banana] и новый «заказанный сервером» список [apple, grape, orange].Перебирайте пользовательский список, выбирая «эквивалентные» элементы из списка, упорядоченного сервером, чтобы получить [orange, apple] и [grape].Затем сделайте что-нибудь вменяемое с «новыми» предметами, например, наклеив его на конец, чтобы получить [апельсин, яблоко, виноград].(В этом примере Banana был удален; мы обрабатываем этот случай, просто не добавляя его в новый список.)
2 голосов
/ 22 ноября 2010

Если они оба ссылаются на одни и те же объекты (а не копии), то дополнительная память будет очень минимальной (накладные расходы NSArray и указатели), и, вероятно, не стоит беспокоиться об этом.

...