2013-07-29 14 views
10

, en NSArray* largeArray diyelim ve sadece ilk x ile yeni NSArray* smallArrayBilinmeyen bir boyut NSArray'ın ilk X öğelerini nasıl alabilirim? Ben bir NSArray var ObjectiveC

nesneleri ... YA largeArray boyutu zaten ben sadece istiyorum < = x olması durumunda almak istiyorum büyükArray'in bir kopyası. Yani indeks x sonra herhangi bir nesneyi kesiliyor.

Bu yaklaşım:

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

this very similar question cevabı oldu. Ancak, büyükArray zaten küçükse bir hatayla başarısız olur. Bunu yapabilirsiniz

+0

Dizinin boyutunu elde etmek her zaman ucuzdur. Belki de ilk etapta büyük diziyi yaratmaktan kaçınmak istersiniz? (Bir dosyadan satırları okurken, maksimum 100 satır okuduktan sonra durmak gibi.) –

cevap

25

... o x küçükse ilk x elemanları veya tam diziyi alacak

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

.

largeArray.count 100.

ise x = 110 o zaman ilk 100 sonuç alacak olursa. Eğer x = 90 ise, ilk 90 sonuçları alacaktır. işleri

Evet,: D

+0

Tamam, bu şimdi çalışacaktır. MAX veya MIN değerini alamazsınız. Biraz daha mantığa ihtiyacın var. – Fogmeister

+5

Neden "NSMakeRange (0, MIN (x, largeArray.count))' kullanılmıyor? – rmaddy

+0

Çünkü aptalım. MAX'ı cevaba koydum ve doğru olmadığını düşündüm. Öyleyse bir nedenden dolayı MIN'yi de reddettim ... LOL! Düzenlendi: D – Fogmeister

-5

İşte bunu yapmanın bariz uzun taraftaki yolu şudur:

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

smallArray bir NSArray'tır (soruda belirttiğiniz gibi). – Abizern

+0

iyi tamam. Hadi buna smallMutableArray diyelim. Bildiğim kadar zarif değil. Bu yüzden soruyordum :-) –

+0

Bu snippet'te birkaç sorun var: 1. 'copy' immutable array oluşturur. 2. 'smallMutableArray' hiçbir zaman 'else' durumunda başlatılamaz. 3. el ile alt dizisi oluşturmaya gerek yok. 4. dizi kısa olduğunda kopyalamaya gerek yok. –

1

Fogmeister cevabı dizisi yeterince genellikle zaten küçüktür durumlarda, gayet iyi olduğunu, ancak Bu cevap her zaman bir kopya oluşturduğundan dolayı hafif derecede verimsiz olacaktır.

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

dizi sınırı içinde zaten

bu sürüm sadece mevcut diziye bir başvuru yapacak: Burada daha verimli bir versiyonudur.

İlgili konular