2010-05-08 60 views
1

我有一個名爲'names'的數組,其字符串如下所示: [「name_23_something」,「name_25_something」,「name_2_something」]; 現在我想按升序排列這個數組,因此它看起來像這樣: [「name_25_something」,「name_23_something」,「name_2_something」];排序包含字符串在目標c中的數組

我想這應該提取數字開頭的,因爲我想要的 排序是由他們完成的:

for(NSString *name in arr) { 
    NSArray *nameSegments = [name componentsSeparatedByString:@"_"]; 
    NSLog("number: %@", (NSString*)[nameSegments objectAtIndex:1]);  
} 

我想創建一個與鍵的字典,但我不知道如果這是正確的objective-c方式,也許有一些方法可以用來代替?你可以用一些提示或示例代碼讓我滿意,這種排序應該如何以適當的方式完成。

謝謝

回答

2
@implementation NSString (MySort) 

- (int) myValue { 
    NSArray *nameSegments = [self componentsSeparatedByString:@"_"]; 
    return [[nameSegments objectAtIndex:1] intValue]; 
} 

- (NSComparisonResult) myCompare:(NSString *)other { 
    int result = [self myValue] - [other myValue]; 
    return result < 0 ? NSOrderedAscending : result > 0 ? NSOrderedDescending : NSOrderedSame; 
} 

@end 

... 

arr = [arr sortedArrayUsingSelector:@selector(myCompare:)]; 
2

退房-[NSArray sortedArrayUsingComparator:]

+0

遺憾的是無法在iPhone OS。 – 2010-05-08 14:25:06

+1

@ed:不,但是對滾動條的一些抑制性使用將我們從文檔中的該條目帶到了其他'-sortedArrayUsing ...'方法的多處。 – 2010-05-08 14:44:26

1

謝謝您的回答!

我不喜歡這樣,你覺得:

NSInteger sortNames(id v1, id v2, void *context) { 
    NSArray *nameSegments = [(NSString*)v1 componentsSeparatedByString:@"_"]; 
    NSArray *nameSegments2 = [(NSString*)v2 componentsSeparatedByString:@"_"]; 
    int num1 = [[nameSegments objectAtIndex:1] integerValue]; 
    int num2 = [[nameSegments2 objectAtIndex:1] integerValue]; 
    if (num1 < num2) 
     return NSOrderedDescending; 
    else if (num1 > num2) 
     return NSOrderedAscending; 

    return NSOrderedSame; 
} 

names = [names sortedArrayUsingFunction:sortNames context:nil]; 

這將導致:

["name_25_something", "name_23_something", "name_2_something"]; 
+0

除了函數的名稱之外,這看起來不錯。 'compareNames'會更好。 – iPadDeveloper2011 2011-05-01 07:34:02

相關問題