2010-08-31 6 views
0

Supposons que j'ai un array ayant elements"am","john","rosa","freedom". Je veux compare ces éléments et le résultat serait le word et le size of the longest word. J'utilise objective C.Comment comparer un élément de tableau?

+0

duplication possible? http://stackoverflow.com/questions/1137839/comparing-arrays-in-objective-c – Adnan

+0

Pourriez-vous préciser: quel type de tableau (tableau de style C ou NSArray)? Rem: comparer deux éléments renvoie toujours une seule valeur (NSOrderDescending, NSOrderAscending ou NSOrderedSame). – VdesmedT

+0

Les instances 'elements' de' NSString' ou d'une autre classe? – falconcreek

Répondre

2

Il n'y a pas une façon « intégrée » de le faire, mais vous pouvez utiliser NSArray « s sortedArrayUsingSelector: et créer une catégorie sur NSString pour fournir une méthode lengthCompare:.

// NSString+LengthCompare.h 
#import NSString.h 
@interface NSString (LengthComparison) 
- (NSComparisonResult)lengthCompare:(NSString *)aString; 
@end 

// NSString+LengthCompare.m 
#import NSString+LengthCompare.h 
@implememtation NSString (LengthComparison) 
- (NSComparisonResult)lengthCompare:(NSString *)aString 
{   
    if ([self length] < [aString length]) { 
     return NSOrderedAscending; 
    } else if ([self length] > [aString length]) { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
} 
@end 

Maintenant, vous pouvez trier une des chaînes par ordre croissant utilisant lengthCompare:

NSArray *array = [NSArray arrayWithObjects: @"am", @"john", @"rosa", @"freedom", nil]; 
NSArray *arraySortedByStringLength = [array sortedArrayUsingSelector:@selector(lengthCompare:)]; 

NString *shortestWord = [[arraySortedByStringLength objectAtIndex:0] retain]; 
NSLog(@"shortest word, %@ has length %d", shortestWord, [shortestWord length]; 
[shortestWord release]; 

NString *longestWord = [[arraySortedByStringLength lastObject] retain]; 
NSLog(@"Longest word, %@ has length %d", longestWord, [longestWord length]; 

[longestWord release]; 
+1

Si vous ne le faites qu'une seule fois, vous pouvez également utiliser - [NSArray sortedArrayUsingComparator:], qui utilise un bloc au lieu d'un sélecteur. Vous n'avez alors pas besoin de déclarer une méthode qui ne sera appelée qu'une seule fois. –

+0

Bonne alternative cependant les blocs sont limités à iOS4 et au-dessus. La balise – falconcreek

+0

est [iphone]. sur Mac, des blocs ont été introduits dans le code mis à jour 10.6 (Snow Leopard) – falconcreek

0

Cela ressemble à un exercice de logique classique ou est-ce quelque chose qui me manque dans votre question?

int longestWordIndex = 0; 
NSUInteger longestWordSize = 0; 
for (int i=0 ; i<[nameArray count] ; i++) { 
    NSString* element = (NSString*)[nameArray objectAtindex:i]; 
    if([element lenght] > longestWordSize) { 
    longestWordSize = [element lenght]; 
    longestWordIndex = i; 
    } 
} 
NSLog("Longest word is %@ with size of :%d", [nameArray objectAtIndex:longestWordIndex], longestWordSize); 
+0

bien merci, je connais cette solution. Mais c'est une solution laïque. Si vous pouvez me dire toutes les méthodes intégrées qui sont disponibles dans Objecive C. – user12345

+0

Oui, je le pensais. Vous pourriez probablement bousiller avec indexesOfObjectsPassingTest mais vous devrez l'appeler deux fois de toute façon. Aucune autre idée – VdesmedT

0

Je vais ajouter une approche aux deux ci-dessus - utiliser un bloc pour faire le corps de votre itération.

__block NSUInteger longestWordSize = -1; // Make sure at least one object will be longer. 
__block NSUInteger longestWordIndex; 

[nameArray enumerateObjectsUsingBlock:^(id currentWord, NSUInteger index, BOOL *stop) { 
    if ([currentWord length] > longestWordSize) { 
     longestWordSize = [currentWord length]; 
     longestWordIndex = index; 
    } 
}]; 

NSLog("Longest word is %@ with size of :%d", [nameArray objectAtIndex:longestWordIndex], longestWordSize); 

Edit: Le max et l'indice doivent être de type de stockage __block afin qu'ils puissent être modifiés à l'intérieur du bloc.

Questions connexes