2010-08-31 6 views
0

Предположим, у меня есть array с elements"am","john","rosa","freedom". Я хочу, чтобы compare эти элементы и результат были бы word и size of the longest word. Я использую objective C.Как сравнить элемент массива?

+0

возможно дубликат? http://stackoverflow.com/questions/1137839/comparing-arrays-in-objective-c – Adnan

+0

Не могли бы вы уточнить: какой массив (массив стилей C или NSArray)? Rem: сравнение двух элементов всегда возвращает одно значение (NSOrderDescending, NSOrderAscending или NSOrderedSame). – VdesmedT

+0

Являются экземплярами 'элементов'' NSString' или какого-то другого класса? – falconcreek

ответ

2

Существует не «встроенный» способ сделать это, но вы можете использовать NSArray «ы sortedArrayUsingSelector: и создать категорию на NSString, чтобы обеспечить способ 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 

Теперь вы можете сортировать строки в порядке возрастания с помощью 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

Если вы собираетесь сделать это один раз, вы также можете использовать - [NSArray sortedArrayUsingComparator:], который использует блок вместо селектора. Тогда вам не нужно объявлять метод, который вызывается только один раз. –

+0

Хорошая альтернатива, однако блоки ограничены iOS4 и выше. – falconcreek

+0

бирка - [iphone]. на Mac были введены блоки в 10.6 (Snow Leopard) – falconcreek

0

Звучит как классическое упражнение по логике или это что-то мне не хватает в вашем вопросе?

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

well thanx, я знаю это решение. Но это решение для простых людей. Если вы можете сказать мне какие-либо встроенные методы, которые доступны в objecive C. – user12345

+0

Да, я так и думал. Вероятно, вы могли бы испортить indexesOfObjectsPassingTest, но вам все равно придется звонить ему дважды. Никакая другая идея – VdesmedT

0

я добавлю еще один подход к двум выше - использовать блок, чтобы сделать тело вашего итерация.

__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: Макс и индекс должен иметь тип __block хранения, так что они могут быть изменены внутри блока.

Смежные вопросы