2013-07-29 93 views
10

在的ObjectiveC我有一個NSArray,姑且稱之爲NSArray* largeArray,我希望得到一個新的NSArray* smallArray只有第一個X對象如何獲取未知大小NSArray的第一個X元素?

...或在largeArray已經是大小< = X我只想事件largeArray的副本。因此在索引x之後截斷任何對象。

這種方法:

NSArray *smallArray = [largeArray subarrayWithRange:NSMakeRange(0, x)]; 

他回答到this very similar question。但是,如果largeArray已經很小,它會失敗並報錯。

+0

獲取數組的大小總是很便宜。也許你想避免首先創建大型數組? (比如,當從一個文件中讀取行時,在讀取最多100行後停止) –

回答

25

你可以這樣做......

NSArray *smallArray = [largeArray subarrayWithRange:NSMakeRange(0, MIN(x, largeArray.count))]; 

這將需要第一個X元素或全陣列,如果是小於x。

如果largeArray.count是100

如果x = 110然後將採取的第一個100個結果。 如果x = 90,那麼它將獲得前90個結果。

是的,這工作:d

+0

好的,現在就可以工作了。你不能只取MAX或MIN。你需要更多的邏輯。 – Fogmeister

+5

爲什麼不使用'NSMakeRange(0,MIN(x,largeArray.count))'? – rmaddy

+0

因爲我是個白癡。我把MAX放在答案中,並認爲這是不對的。然後出於某種原因,我也排除了MIN ... LOL!編輯:D – Fogmeister

-5

這裏是做它的明顯長手道:

NSMutableArray* smallMutableArray; 
if ([largeArray count] <= x) { 
    smallMutableArray = [largeArray copy]; 
} else { 
    for (int i=0; i<x; i++) { 
     [smallMutableArray addObject:[largeArray objectAtIndex:i]]; 
    } 
} 
+0

由於smallArray是一個NSArray(正如您在問題中所述),您不能將對象添加到它,因爲它是不可變的。 – Abizern

+0

好吧。我們稱之爲smallMutableArray。我知道這並不高雅。這就是爲什麼我問:-) –

+0

這段代碼中的幾個問題:1.'copy'創建不可變數組。 2.'smallMutableArray'永遠不會在'else'情況下被初始化。 3.無需手工創建子陣列。 4.陣列短時無需複製。 –

1

Fogmeister的答案是非常好的,但是,在陣列往往已經足夠小的情況下, ,這個答案將是溫和的低效率,因爲它總是會做一個副本。這裏是一個更高效的版本:

NSAarray *smallArray = largeArray; 
if (smallArray.count > MAX_NUM_ITEMS) 
    smallArray = [smallArray subarrayWithRange:NSMakeRange(0, MAX_NUM_ITEMS)]; 

當數組已經在限制範圍內時,這個版本只會引用現有的數組。

相關問題