0

構造体オブジェクトが に配置される cpp コードがありますCLISTS。このコードを Objective C に移植しています。

CLIST は.RemoveAt.GetAt.InsertBefore.GetNext.GetHeadPosition関数を持つ双方向リンク リストに似ています。

で同じものを実装する方法Objective C。Objective C で双方向リンク リストを実装する必要がありますか?それを使用する他の定義済みの方法はありますか?

4

1 に答える 1

1

CLIST はおそらく循環していますか? したがって、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 カテゴリの方がうまくいくでしょうが、要点はわかります)

おそらく、配列の位置を別の変数に保持GetNextGetHeadPositionたいでしょう。GetNext の場合:

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

GetHeadPosition の場合は、次のようにします。

return arrayPosition;

編集: NSArray を反復処理する場合、最も簡単な方法は、実際には明示的なものを無視して使用することです。

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

これは通常、GetNext の類似物は実際には必要ないことを意味しますが、そのループ内で配列を変更することはできないため、常に使用できるとは限りません。

于 2011-05-16T14:41:22.680 に答える