Как я могу удалить первый элемент массива в Objective C? - PullRequest
11 голосов
/ 18 июня 2009

В Objective C, есть ли однострочник или что-то маленькое для удаления (сокращения на единицу) и возврата первого элемента массива, независимо от его индекса?

Ответы [ 6 ]

21 голосов
/ 18 июня 2009

Я не знаю метода, который возвращает удаленный элемент, но вы можете сделать это, используя комбинацию NSArray#objectAtIndex:0 и NSMutableArray#removeObjectAtIndex:0. Я полагаю, вы могли бы ввести новую категорию методов в NSMutableArray, которая реализует метод shift.

3 голосов
/ 18 июня 2009

Это было бы плохо, чтобы сделать.

Objective-C на iPhone на самом деле может использовать большинство преимуществ производительности C.

Если вы посмотрите на некоторые из моих других постов, вы увидите, что я ИЗУЧИТЕЛЬНО против преждевременной оптимизации, но когда вы кодируете на уровне C, есть только некоторые вещи, которые вы не делаете без необходимости.

  • Переместить память
  • Повторяющиеся структуры
  • Выделение малонаселенных блоков памяти
  • Внутренние петли
  • ... (Есть еще много всего, но мой C-life ржавый и, как я уже сказал, я против оптимизации)

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

Я был бы очень удивлен, узнав, что в Objective-C не было структуры данных очереди.

Кроме того, не стремитесь к однострочникам. Все, что касается краткого кода, переоценено. Если имеет смысл вызывать метод, пусть будет так.

2 голосов
/ 03 февраля 2016

Конечно, уже слишком поздно помогать оригинальному постеру, но если у вас простой NSArray, а не NSMutableArray, это хорошо работает:

id myData = myArray.firstObject;
myArray = [myArray subarrayWithRange:NSMakeRange(1, myArray.count - 1)];
1 голос
/ 28 июня 2009

Если у вас есть массив obj *arr, где obj - это класс / имя типа, а arr - это массив, вы можете просто сказать arr+1, чтобы получить массив без первого элемента.

1 голос
/ 18 июня 2009

Объекты массива какао (NSArray / NSMutableArray) не обеспечивают эквивалент в одну строку - вам сначала нужно прочитать объект, а затем удалить его. Тот факт, что эти классы предоставляют методы -lastObject и -removeLastObject, но не -firstObject и -removeFirstObject, должен напоминать, что удаление из передней части массива обычно неэффективная операция, поскольку содержимое должно быть смещено (скопировано) на одну позицию вперед. Это особенно верно для массивов в C, которые неразрывно связаны с указателями.

Если вы работаете с чем-либо, кроме примитивных типов данных и / или очень маленьких массивов, вам может потребоваться учитывать, что поведение «смещения» первого элемента указывает на структуру данных очереди, Подробнее о том, как создать очередь для объектов, см. этот вопрос SO . Лично, мое мнение по этому вопросу состоит в том, что настоящий класс очереди обеспечивает самую чистую идиому программирования. Вы даже можете определить свой собственный метод (возможно, как категорию в NSMutableArray или другом классе), который предоставляет , чтобы обеспечить то, что вы хотите:

@interface NSMutableArray (QueueOneLiner)
  - (id) removeAndReturnFirstObject; // Verbose, but clearer than "shift"
@end

@implementation NSMutableArray (QueueOneLiner)
  - (id) removeAndReturnFirstObject {
    id object = [[self objectAtIndex:0] retain];
    [self removeObjectAtIndex:0];
    return [object autorelease];
  }
@end

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

0 голосов
/ 19 декабря 2012

Используйте этот код,

 [arrayName removeObjectAtIndex:0];

это может вам помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...