КЛИСТЫ в Задаче C - PullRequest
       28

КЛИСТЫ в Задаче C

0 голосов
/ 16 мая 2011

У меня есть код cpp, где объекты struct помещаются в CLISTS. Я портирую этот код в Objective C.

CLIST похож на дважды связанный список с функциями .RemoveAt, .GetAt, .InsertBefore, .GetNext, .GetHeadPosition.

Как реализовать то же самое в Objective C. Нужно ли реализовывать двусвязный список в Objective C. Есть ли другие предопределенные методы для его использования.

1 Ответ

1 голос
/ 16 мая 2011

КЛИСТ предположительно круговой? Отсюда GetHeadPosition?

В любом случае NSArray (или NSMutableArray в этом случае, поскольку вы хотите вставить) - это обычный способ сохранить упорядоченные списки в Objective-C.

Для RemoveAt используйте removeObjectAtIndex:. Для GetAt используйте objectAtIndex:. Для InsertBefore вы, вероятно, захотите написать что-то вроде:

- (void)insert:(id)objectToInsert before:(id)referenceObject
{
    int index = [array indexOfObject:referenceObject];

    if(index == NSNotFound) return; // or whatever you'd expect. 
                                    // Maybe object is just inserted at the end?

    index = index - 1;
    if(index < 0) index = [array count];
    [array insertObject:objectToInsert atIndex:index];
}

(что, вероятно, будет лучше в категории NSArray, но вы получите точку)

Для GetNext и GetHeadPosition вы, вероятно, хотите сохранить позицию массива в отдельной переменной. Так для GetNext:

arrayPosition = (arrayPosition + 1)%[array count];
return [array objectAtIndex:arrayPosition];

А для GetHeadPosition просто:

return arrayPosition;

РЕДАКТИРОВАТЬ: для итерации NSArray, самый простой способ на самом деле игнорировать что-либо явное и просто использовать:

for(ObjectType *object in array)
{
     /* do something with object */
}

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

...