Как сделать разреженный массив в Какао

Сделал большую работу в прошлом с EJB 2.1, довольным оставить его.

ценностное предложение EJB остается верным для 3,0 и несет хорошую легкую модель программирования. Управление транзакциями, параллелизм, управление версиями данных, управление состоянием, это нетривиальные проблемы для решения правильно, и платформы EE Java продолжают делать превосходное задание.

По общему признанию, я использую, в спящем режиме и Шов для дальнейшего построения на некоторых функциях Java EE, таким образом, это не строго справедливо, чтобы я сказал, что самим EJB 3.0 является Мекка. Однако я нахожу слишком много разработчиков, выводящих общеизвестного ребенка с водой в ванне, когда они разочаровываются в Java полностью и перемещают во что-то больше моды как направляющие.

Шов служит хорошей основой связующего звена, которая сохраняет количество усилия программиста довольно низко. Также позволяет Вам выбрать проект основанием проекта, когда EJB имеет смысл по сравнению с POJOs, не имея необходимость изменять Ваш стиль программирования.

8
задан Alex Rozanski 30 August 2009 в 22:16
поделиться

3 ответа

Похоже, ваши потребности будут лучше удовлетворены с помощью NSMutableDictionary . Вам нужно будет обернуть int s в объекты NSNumber следующим образом:

-(void)addItem:(int)key value:(id)obj
{
    [data setObject:obj forKey:[NSNumber numberWithInt:key]];
}

-(id)getItem:(int)key
{
    return [data objectForKey:[NSNumber numberWithInt:key]];
}

Увеличить размер NSMutableArray было непросто, поскольку вы не можете в промежуточных слотах нет объектов. Однако вы можете использовать [NSNull null] в качестве «заполнителя», чтобы создать видимость разреженного массива.

18
ответ дан 5 December 2019 в 04:36
поделиться

Я не согласен с ответом bbum по этому поводу. NSPointerArray - это массив, а не разреженный массив, и между ними есть важные различия.

Я настоятельно рекомендую не использовать решение bbums.

Документация для NSPointerArray доступен здесь .

Какао уже имеет объект массива, как определено классом NSArray . NSPointerArray наследуется от NSObject , поэтому он не является прямым подклассом NSArray . Однако документация NSPointerArray определяет класс как таковой:

NSPointerArray - это изменяемая коллекция, смоделированная на основе NSArray, но она также может содержать значения NULL

Я сделаю аксиоматическое предположение, что это определение из документации утверждает, что это «логический» подкласс NSArray .

Определения-

«Общий» массив - это: набор элементов, каждый из которых имеет уникальный номер индекса, связанный с ним.

Массив без уточнений: «Общий» массив, где индексы элементов имеют следующие свойства: Индексы для элементов в массиве начинаются с 0 и последовательно увеличиваются. Все элементы в массиве содержат номер индекса, меньший, чем количество элементов в массиве. Добавление элемента в массив должно происходить по индексу + 1 последнего элемента в массиве, или элемент может быть вставлен между двумя существующими порядковыми номерами элементов, что приводит к увеличению порядкового номера всех последующих элементов на единицу. Элемент с существующим номером индекса может быть заменен другим элементом, и эта операция не изменяет номера индекса существующих операций. Следовательно, вставка и замена - это две разные операции.

Разреженный массив - это: «общий» массив, в котором номер индекса первого элемента может начинаться с любого номера, а номер индекса последующих элементов, добавляемых в массив, не имеет отношения к или ограничениям на основе других элементов в массиве. Вставка элемента в разреженный массив не влияет на порядковый номер других элементов в массиве. Вставка элемента и замена элемента обычно являются синонимами в большинстве реализаций. Подсчет количества элементов в разреженном массиве не имеет отношения к порядковым номерам элементов в разреженном массиве.

Эти определения делают определенные предсказания относительно поведения массива «черного ящика», которые можно проверить. Для простоты мы сосредоточимся на следующих отношениях:

В массиве порядковый номер всех элементов в массиве меньше, чем количество элементов в массиве. Хотя это может быть верно в отношении разреженного массива, это не является обязательным требованием.

В комментарии к bbum я заявил следующее:

a NSPointerArray не является разреженным массивом и не является вести себя как один. Вам все равно нужно заполнить все неиспользуемые индексы указателями NULL . Вывод из [pointerArray insertPointer: @ "test" atIndex: 17]; на только что созданном NSPointerArray :

*** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [NSConcretePointerArray insertPointer: atIndex:]: попытка вставить указатель при индексе 17 за пределами 0 '

Утверждается, не доказывая, что поведение NSPointerArray выше нарушает само определение разреженного массива. Эта часть сообщения об ошибке показывает: попытка вставить указатель по индексу 17 за пределы 0 ', в частности, часть о необходимости добавления первого нового элемента по индексу 0 .

bbum затем комментирует:

Это неверно. Вы не смогли вызвать -setCount: для установки достаточного размера емкости.

Это бессмысленный "установить счетчик" количества элементов в разреженном массиве. Если бы NSPointerArray был разреженным массивом, можно было бы ожидать, что после добавления первого элемента с индексом 17 счетчик количества элементов в NSPointerArray будет равен единице. Однако, следуя рекомендациям bbums, количество элементов в NSPointerArray после добавления первых элементов составляет 18 , а не 1 .

QED- Показано что NSPointerArray на самом деле является массивом, и для целей этого обсуждения - NSArray .

Кроме того, bbum делает следующие дополнительные комментарии:

NSPointerArray, безусловно, действительно поддерживает отверстия.

Это доказуемо неверно. Массив требует, чтобы все содержащиеся в нем элементы что-то содержали, даже если это что-то «ничто». Это не относится к разреженному массиву. Это и есть определение «дыры» для целей данного обсуждения. NSPointerArray не содержит дыр в смысле разреженного массива этого термина.

Это был один из основных моментов при написании класса. Сначала вы должны установить счетчик.

Доказуемо бессмысленно «устанавливать счетчик» разреженного массива.

Является ли внутренняя реализация разреженным массивом или хешем или и т. Д., Это деталь реализации .

Это правда. Однако документация для NSPointerArray не содержит никаких ссылок на то, как он реализует свой массив элементов или управляет им. Более того, в нем нигде не говорится, что NSPointerArray «эффективно управляет массивом указателей NULL».

QED-bum зависит от недокументированного поведения , которое NSPointerArray эффективно обрабатывает NULL указатели внутри разреженного массива. Поскольку недокументированное поведение , это поведение может измениться в любой момент или даже не применимо ко всем видам использования NSPointerArray . Изменение этого поведения будет катастрофическим , если самый высокий индексный номер, хранящийся в нем, будет достаточно большим (~ 2 ^ 26).

И, фактически, он не реализован как один большой кусок памяти ...

Опять же, это частная деталь реализации, которая недокументирована . Это крайне плохая практика программирования - полагаться на этот тип поведения.

Поскольку недокументированное поведение , это поведение может измениться в любой момент или даже не применимо ко всем видам использования NSPointerArray . Изменение этого поведения будет катастрофическим , если самый высокий индексный номер, хранящийся в нем, будет достаточно большим (~ 2 ^ 26).

И, фактически, он не реализован как один большой кусок памяти ...

Опять же, это частная деталь реализации, которая недокументирована . Это крайне плохая практика программирования - полагаться на этот тип поведения.

Поскольку недокументированное поведение , это поведение может измениться в любое время или может даже не применяться ко всем видам использования NSPointerArray . Изменение этого поведения будет катастрофическим , если самый высокий индексный номер, хранящийся в нем, будет достаточно большим (~ 2 ^ 26).

И, фактически, он не реализован как один большой кусок памяти ...

Опять же, это частная деталь реализации, которая недокументирована . Это крайне плохая практика программирования - полагаться на этот тип поведения.

он не реализован как один большой кусок памяти ...

Опять же, это частная деталь реализации, которая недокументирована . Это крайне плохая практика программирования - полагаться на этот тип поведения.

он не реализован как один большой кусок памяти ...

Опять же, это частная деталь реализации, которая недокументирована . Это крайне плохая практика программирования - полагаться на этот тип поведения.

-3
ответ дан 5 December 2019 в 04:36
поделиться

Используйте NSPointerArray.

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSPointerArray_Class/Introduction/Introduction.html

NSPointerArray - изменяемая коллекция по образцу NSArray, но он также может содержать значения NULL, которые могут быть вставлен или извлечен (и который внести свой вклад в счет объекта). Более того, в отличие от традиционных массивов, вы можете установить количество массива прямо. В мусоре, собранном среды, если указать обнуление слабая конфигурация памяти, если элемент собран, он заменен на значение NULL.

Если вы должны были использовать решение, подобное словарю, используйте NSMapTable. Он позволяет использовать целочисленные ключи. Рекомендуемое решение на основе NSMutableDictionary имеет огромное количество накладных расходов, связанных со всей упаковкой и распаковкой целочисленных ключей.

32
ответ дан 5 December 2019 в 04:36
поделиться