2012-06-24 3 views
0

J'ai un peu de problème. J'ai un NSMutableDictionary avec 10 NSMutableArrays dedans. Chaque tableau a quelque part entre 0 et 10 chiffres qui peuvent être tous des nombres entiers, par ex. 12 ou 103.Obtenir le top 10 des plus hauts nombres de tableau?

Ce que je dois faire est d'obtenir le top 10 des nombres les plus élevés à travers chacun des tableaux. Le problème est, je dois garder une référence du tableau dont il est issu dans le dictionnaire (la clé) et la position de l'index du nombre du tableau qu'il est venu former.

J'espère que vous pouvez m'aider à résoudre ce problème, merci.

Répondre

4

manière la plus simple, est de trier le tableau par ordre décroissant, puis saisir les 10 premiers indices

ou si elles sont des dictionnaires à l'intérieur, itérer le dictionnaire allValues, saisir tous les tableaux, ajouter tous les éléments à l'intérieur d'un tableau commun, et sorte que

+0

Je comprends que cela semble évident et relativement simple, cependant, je peux les trier car je dois conserver (ou au moins être en mesure de faire référence) les 10 meilleurs index originaux des nombres. –

+0

lorsque vous obtenez le top 10 des éléments, vous pouvez créer un nouveau tableau qui contient les index des éléments d'origine dans le tableau original –

+0

Ce qui me trouble, c'est comment quand vous trier les nombres pouvez-vous obtenir l'index des premiers chiffres avant ils ont été mélangés? –

0

Il semble que la structure de données que vous souhaitez utiliser soit un tableau d'objets, où chaque objet est fonctionnellement similaire à un "chemin d'index" sauf qu'il est composé d'une chaîne (clé) et d'une valeur (décalage). En supposant que la recherche réelle des nombres les plus élevés ne soit pas en cause, je suggérerais de créer un de ces objets chaque fois que vous trouveriez un nombre candidat de sorte que, une fois les dix premiers trouvés, les objets puissent être utilisés comme back-pointeurs vers les emplacements sources des numéros.

+0

Je ne suis pas certain de vous suivre. Utilisez les 10 premiers numéros trouvés en tant que pointeurs arrière? Mais qu'en est-il s'il y a des numéros en double? Comment l'associeriez-vous à l'index original correct? –

+0

Utilisez l'objet contenant la clé de dictionnaire et l'index de tableau comme chemin d'accès à l'original. –

0

Vous devez court-circuiter votre tableau dans l'ordre décroissant en utilisant 'C' logiques. Ici, je vais donner un exemple court en fonction de votre état ....

// adding 20 elements in an array, suppose this is your original array (array1). 
NSMutableArray *array1 = [[NSMutableArray alloc]init]; 

for(int i=0;i<20;i++) 
{ 
    NSString *str = [NSString stringWithFormat:@"%d",(i*4)]; 
    [array1 addObject:str]; 
} 

//make a copy of your original array 
NSMutableArray *array2 = [[NSMutableArray alloc]initWithArray:array1]; 


// this is the array which will get your shorting list 
NSMutableArray *array3 = [[NSMutableArray alloc]init]; 

//declare an integer for compare as a maximum number and it to 0 intially 
int max = 0; 


// this is the logic to short an array 
for(int i=0;i<20;i++) 
{ 
    for(int j=0;j<[array2 count];j++) 
    { 
     int f = [[array2 objectAtIndex:j] intValue]; 
     if(max<f) 
     { 
      max = f; 
     } 
    } 

    NSString *str = [[NSNumber numberWithInt:max]stringValue]; 

    //max has a maximum value then add it to array3 and remove from array2 
    //for a new shorting 

    [array3 addObject:str]; 
    [array2 removeObject:str]; 

    // set 0 to max again 
    max = 0; 
} 

    //now after all procedure print the **array3** 
    // and you will get all the objects in descending order, 
    //you can take top **10** variables from **array3** 

    NSLog(@"your shorting array %@", **array3**); 
} 

Merci!

0

sons comme une sorte de devoirs :)

Vous avez donc ceci:

NSMutableDictionary* source = [@{ 
    @"1" : @[ @10, @20, @100 … ], 
    @"2" : @[ @8, @42, @17 … ] 
} mutableCopy]; 

permet donc commencer par créer un autre arrangement:

NSMutableArray* numbers = [NSMutableArray new]; 
for (NSArray* array in source.allValues) 
{ 
    for (NSNumber* number in array) 
    { 
     [numbers addObject: @{ @"number" : number, @"parent" : array }]; 
    } 
} 

Voici ce que nous obtenons:

@[ 
    @{ @"number" : @10, @"parent" : <array> }, 
    @{ @"number" : @20, @"parent" : <array> }, 
    … 
] 

Maintenant, nous pouvons trier et trouver les numéros que vous vouliez.

[numbers sortUsingComparator: ^(id lhs, id rhs){ 
    return [((NSDictionary*) rhs)[@"number"] compare: ((NSDictionary*) lhs)[@"number"]]; 
}]; 
NSArray* topNumbers = [numbers subarrayWithRange: NSMakeRange(0, 10)]; 

Nous y sommes. topNumbers contient les numéros dont vous avez besoin le long du tableau source.

C'est une façon assez naïve de le faire. Il peut être optimisé tant dans le temps CPU que dans l'utilisation de la mémoire. Mais bon, reste simple n'est pas une mauvaise chose. Non adressé: et si les nombres dixième et onzième sont égaux? (adressé ici: Pick Out Specific Number from Array?) contrôles de portée. pas testé, pas même compilé. ;)

+0

Cette ligne '[nombre addObject: @ {@" nombre ": nombre, @" parent ": tableau}];' lance une erreur à cause du premier '@', mais pourquoi? Désolé je n'ai pas vu un objet ajouté à un tableau comme celui-ci avant. (Merci pour votre réponse!) –

+0

Xcode 4.4/4.5 avec des littéraux. Vous pouvez utiliser NSDictionary -dictionaryWithObjectsAndKeys: à la place, et NSArray -arrayWithObjects: à la place, mais tellement verbeux. @ {} -> NSDictionary, @ [] -> NSArray, @ 10 -> NSNumber. –

+0

Ahh! Ce sera le problème, je suis sur 4.3.3. Merci d'avoir expliqué cela. Aussi, si je ne me trompe pas, le tableau 'numbers' ne veut-il pas être un dictionnaire? –

0

Parcourez les tableaux en créant un objet/une structure pour chaque élément, constitué de la valeur numérique «clé» et du «chemin» (indices matriciels) de l'élément. Triez les objets/structures ainsi créés. (Ceci est appelé un "tri des étiquettes".

L'autre approche, si vous avez seulement besoin des N valeurs supérieures (où N < < nombre total d'entrées) est de créer un tableau de N éléments, constitué de la clé ci-dessus et l'information de chemin. Parcourez tous les tableaux et comparez chaque élément du tableau à la plus petite clé du N actuellement stockée. Si vous trouvez un élément plus grand que le plus petit stocké, remplacez le plus petit stocké et triez les N éléments pour sélectionner un nouveau plus petit stocké.

Questions connexes