2010-09-01 7 views
2

Je veux trier un tableau par ses objets, puis obtenir les indices comme ceci:Comment puis-je obtenir un tableau des index d'un autre tableau qui a été trié?

NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects: @"3", @"2", @"1", @"0", @"1", @"2", nil]; 

Je veux que les index des objets dans l'ordre croissant. Ici, parce que la valeur la plus basse a un indice de 3, les index seraient: 3, 2, 4, 1, 5, 0 ou quelque chose comme ça.

Des idées?

Merci!

Répondre

2

Voici ce que je fini par faire:

//Create a mutable array of the indexes in the myArray (just a list from 0...n) 

NSMutableArray *indexes = [[NSMutableArray alloc] init]; 

for (int i = 0; i < myArray.count; i++){ 
    [indexes addObject: [NSNumber numberWithInteger:i]]; 
} 

//Create a dictionary with myArray as the objects and the indexes as the keys 
NSDictionary *tempDictionary = [NSDictionary dictionaryWithObjects:myArray forKeys:indexes]; 

//Create an array of myArray's keys, in the order they would be in if they were sorted by the values 
NSArray *sorted = [tempDictionary keysSortedByValueUsingSelector: @selector(compare:)]; 
1

il suffit de trier et d'utiliser indexOfObject:. Comme si:

NSArray *sorted = [myArray sortedArrayUsingSelector: @selector(compare:)]; 
NSMutableArray *indices = [NSMutableArray array]; 
for (id object in myArray) 
    [indices addObject: [NSNumber numberWithInteger: [sorted indexOfObject: object]]]; 

(. Sur ma tête, espère que cela fonctionne)

+0

Super! Cela fonctionne presque. Le seul problème est que le parce qu'il y a plusieurs objets avec le même index, il retourne seulement la valeur d'index la plus basse. (Voir dans l'exemple ci-dessus.) Savez-vous comment je peux l'obtenir pour retourner toutes les valeurs d'index? – Jonah

+0

@Jonah: Vous avez un problème fondamental avec l'obtention de plus d'un index dans ce cas car les deux objets @ "1" et @ "1" dans votre exemple sont logiquement égaux en ce que '-isEqual:' renvoie YES et est presque certainement en fait le même objet (parce que le compilateur supprime les chaînes constantes en double). – JeremyP

+0

Les deux chaînes sont le même objet. Vous ne serez pas en mesure de les distinguer. Ce que vous pouvez faire est de remplacer tous les objets de myArray par un espace réservé comme 'NSNull'. La boucle sera un peu plus compliquée alors, bien que ... –

1

Vous pouvez également utiliser ci-dessous du code, mai son utile,

NSSortDescriptor *_lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES]; 
NSArray *_lastArray = [NSArray arrayWithObject:_lastDescriptor]; 


firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys] sortedArrayUsingDescriptors:_lastArray]; 
//firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
for (NSString *eachlastIndex in firstCharacterArray) 
{ 
    NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" 
                    ascending:YES]; 
    //selector:@selector(localizedCaseInsensitiveCompare:)] ; 
    NSArray *descriptorslast = [NSArray arrayWithObject:lastDescriptor]; 
    [[nameIndexesDictionary objectForKey:eachlastIndex] sortUsingDescriptors:descriptorslast]; 
    [lastDescriptor release]; 
}