11
votes

Comment puis-je obtenir les premiers x éléments d'une taille inconnue Nsarray?

Dans Objectivec j'ai un nsarray, appelons-le Nsarray * Largearray , et je veux obtenir un nouveau Nsarray * SmallArray avec juste les premiers x objets

... ou dans le cas où LargeArray est déjà une taille <= x, je veux juste une copie de la largone. Donc, tronquer des objets après index x.

Cette approche: xxx

était la réponse à Cette question très similaire . Mais il échoue avec une erreur si LargeArray est déjà faible.


1 commentaires

Il est toujours bon marché d'obtenir la taille d'un tableau. Peut-être que vous voulez éviter de créer le grand tableau en premier lieu? (Comme, lors de la lecture de lignes d'un fichier, pour arrêter après avoir lu un maximum de 100 lignes.)


3 Réponses :


29
votes

vous pouvez faire cela ... xxx

qui prendra les premiers éléments x ou le réseau complet s'il est plus petit que x.

si largearray.count est 100.

si x = 110, il faudra les 100 premiers résultats. Si x = 90, il faudra les 90 premiers résultats.

Yep, qui fonctionne: D


6 commentaires

Ok, cela fonctionnera maintenant. Vous ne pouvez pas simplement prendre max ou min. Vous avez besoin d'un peu plus logique.


Pourquoi ne pas utiliser nsmakerange (0, min (x, largarraray.count)) ?


Parce que j'étais idiot. Je mets max dans la réponse et je pensais que ce n'était pas correct. Puis pour une raison quelconque, j'ai exclu min Min ... lol! Édité: D


C'est une solution géniale, mais vous avez laissé une parenthèse étroite dans la solution!


En outre, le "A" dans "la bananewithbriger" ne doit pas être capitalisé. Enfin, ne devrait pas "largarray.count" être "largomearray.count-1" pour maquiller la différence entre et l'index à partir de zéro et un compte à partir de 1?


J'ai fait les changements merci. @Amos Nsrange est créée à l'aide d'un emplacement et d'une longueur de départ. Pas un emplacement de fin. Ainsi, utiliser le nombre est correct dans ce cas.



-5
votes

Voici le moyen évident de le faire:

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


3 commentaires

Comme le petiteloppe est un nsarray (comme vous l'avez dit dans la question), vous ne pouvez pas y ajouter d'objets car il est immuable.


bien ok. Appelons ça smallmutableRayRay. Ce n'est pas élégant que je connais. C'est pourquoi je demandais :-)


Plusieurs problèmes dans cet extrait: 1. copier crée une matrice immuable. 2. SmallMutableArray ne sera jamais initialisé dans ele . 3. Pas besoin de créer de la banane à la main. 4. Pas besoin de copier lorsque le tableau est court.



1
votes

La réponse de FogMeister est parfaitement bonne, mais dans des situations où la matrice est souvent déjà assez petite, cette réponse sera légèrement inefficace car elle en fait toujours une copie. Voici une version plus efficace:

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


0 commentaires