2013-07-29 12 views
10

W ObjectiveC Mam NSArray, nazwijmy to NSArray* largeArray i chcę, aby dostać nowy NSArray* smallArray tylko z pierwszego x obiektówJak uzyskać pierwsze elementy X o nieznanym rozmiarze NSArray?

... albo w przypadku, largeArray jest już wielkość < = x Chcę tylko kopia obiektu largeArray. Tak więc obcinanie obiektów po indeksie x.

Podejście:

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

była odpowiedzią na this very similar question. Ale kończy się niepowodzeniem z błędem, jeśli largeArray jest już mały.

+0

Zawsze jest tanie uzyskanie rozmiaru tablicy. Może chcesz w ogóle uniknąć tworzenia dużej tablicy? (Podobnie jak podczas czytania linii z pliku, aby zatrzymać się po przeczytaniu maksymalnie 100 linii.) –

Odpowiedz

25

Można to zrobić ...

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

To zajmie pierwsze elementy X lub pełną gamę jeśli jest mniejsza niż x.

Jeśli largeArray.count wynosi 100.

Jeśli x = 110 to zajmie 100 wyników. Jeśli x = 90, to zajmie pierwszych 90 wyników.

Tak, to działa: D

+0

OK, to będzie działać teraz. Nie możesz po prostu wziąć MAX lub MIN. Potrzebujesz nieco więcej logiki. – Fogmeister

+5

Dlaczego nie używać 'NSMakeRange (0, MIN (x, largeArray.count))'? – rmaddy

+0

Ponieważ byłem idiotą. W odpowiedzi udzieliłem MAXowi i myślałem, że to nie w porządku. Z jakiegoś powodu wykluczyłem też MIN ... LOL! Edytowane: D – Fogmeister

-5

Oto oczywisty sposób długo ręka robi:

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

Jako smallArray jest NSArray (jak już stwierdzono w pytaniu) nie można dodawać do niego obiektów, ponieważ jest niezmienny. – Abizern

+0

dobrze OK. Nazwijmy go smallMutableArray. To nie jest eleganckie, które znam. Dlatego właśnie pytałem :-) –

+0

Kilka problemów w tym fragmencie: 1. 'copy' tworzy niezmienną tablicę. 2. "smallMutableArray" nigdy nie zostanie zainicjowane w przypadku "else". 3. Nie ma potrzeby tworzenia podtablicy ręcznie. 4. Nie trzeba kopiować, gdy tablica jest krótka. –

1

odpowiedź Fogmeister jest doskonale dobry, ale w sytuacjach, gdy tablica jest często już wystarczająco małe , odpowiedź ta będzie łagodnie nieefektywna, ponieważ zawsze tworzy kopię. Oto bardziej wydajna wersja:

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

Gdy tablica jest już w granicach tej wersji, po prostu odniesie się do istniejącej tablicy.

Powiązane problemy