2011-08-16 56 views
2

我想知道是否可以根据内包含的数字值对NSArray的NSStrings进行排序。基本上它是一个进程ID和进程名称列表,我想根据进程ID对进程进行排序。阵列看起来像这样:如何按照包含的数字对NSStrings数组进行排序? (按升序排列)

"286    Google Chrome He", 
"1209    ibtool", 
"0    kernel_task", 
"1    launchd", 
"10    kextd", 
"11    notifyd", 
"12    diskarbitrationd", 
"13    configd", 
"14    syslogd", 
"15    DirectoryService", 
"16    distnoted", 
"18    ntpd", 
"22    SystemStarter", 
"25    securityd", 
"28    mds", 
"29    mDNSResponder", 
"30    loginwindow", 
"31    KernelEventAgent", 
"33    hidd", 
"34    fseventsd", 
"36    dynamic_pager", 
"42    blued", 
"43    autofsd", 
"46    WDSmartWareD", 
"47    WDDMService", 
"61    coreservicesd", 
"62    WindowServer", 
"71    HWPortCfg", 
"72    HWNetCfg", 
"159    socketfilterfw", 
"165    cvmsServ", 
"177    coreaudiod", 
"191    vmnet-bridge", 
"196    vmnet-dhcpd", 
"198    vmnet-netifup", 
"200    vmnet-dhcpd", 
"204    vmnet-natd", 
"206    vmnet-netifup", 
"220    launchd", 
"224    Dock", 
"225    SystemUIServer", 
"226    Finder", 
"228    pboard", 
"229    fontd", 
"240    UserEventAgent", 
"247    AirPort Base Sta", 
"252    iprint-listener", 
"253    StatusMenu", 
"254    Dropbox", 
"271    dbfseventsd", 
"275    Google Chrome", 
"295    Google Chrome He", 
"298    AppleSpell", 
"634    Google Chrome He", 
"696    Google Chrome He", 
"730    Microsoft Word", 
"733    Microsoft Databa", 
"736    Microsoft AU Dae", 
"1095    usbmuxd", 
"1110    Xcode", 
"1171    Interface Builde", 
"1282    Interface Builde", 
"1283    Interface Builde", 
"1475    Google Chrome He", 
"1531    Google Chrome He", 
"1533    Google Chrome He", 
"1681    Google Chrome He", 
"1682    Google Chrome He", 
"1686    Google Chrome He", 
"1687    Google Chrome He", 
"1692    Google Chrome He", 
"1945    Google Chrome He", 
"2088    Keynote", 
"2268    Google Chrome He", 
"2326    Google Chrome He", 
"2481    Google Chrome He", 
"2545    Google Chrome He", 
"2596    Google Chrome He", 
"2766    mdworker", 
"2933    Google Chrome He", 
"2963    iPhone Simulator", 
"2967    SimulatorBridge", 
"2970    lsd", 
"2971    SpringBoard", 
"2982    ocspd", 
"2998    installd", 
"3000    TableViewControl", 
"3001    taskgated", 
"3002    gdb-i386-apple-d" 

任何帮助非常感谢!

+1

为什么地球上不是你将这些字符串变成更有用的东西? –

+0

因为我只需要在UITableView中显示它们。 :) –

回答

5

是的,你可以使用下面的NSArray实例方法:

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context 

你需要定义一个int函数,有三个参数:两个数组元素进行比较,和上下文。它返回一个NSComparisonResult(-1,0或1)。例如:

NSArray *sortedArray = [origArray sortedArrayUsingFunction:firstWordIntCompare context:NULL]; 
+0

谢谢!这很好 –

7

对于你的情况,这样做是一种描述最简单的方法:

NSInteger firstWordIntCompare(id stringLeft, id stringRight, void *context) 
{ 
    // Extract number from stringLeft and stringRight 
    NSArray *wordsLeft = [stringLeft componentsSeparatedByString:@" "]; 
    NSArray *wordsRight = [stringRight componentsSeparatedByString:@" "]; 
    NSString *firstWordLeft = wordsLeft.count ? [wordsLeft objectAtIndex:0] : nil; 
    NSString *firstWordRight = wordsRight.count ? [wordsRight objectAtIndex:0] : nil; 
    int intLeft = [firstWordLeft intValue]; 
    int intRight = [firstWordRight intValue]; 

    if (intLeft < intRight) 
     return NSOrderedAscending; 
    else if (intLeft > intRight) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 

通过调用NSArray的方法与你的函数然后返回数组排序

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"integerValue" ascending:YES]; 
NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];