我需要根据 "_" 之后的数字对文件列表进行排序:
"filename_1" "filename_2" ......
我知道我可以提取数字,然后用数字对文件名进行排序,但是我必须考虑如果存在一些非法名称并且程序变长怎么办。
我想做的只是简单地比较整个字符串,相同的字符必须具有相同的数字。但是当我执行 [@"word" intValue] 时,如果字符串不是数字,则结果为零。我想知道是否有一种将字符串转换为数字的好方法。
我需要根据 "_" 之后的数字对文件列表进行排序:
"filename_1" "filename_2" ......
我知道我可以提取数字,然后用数字对文件名进行排序,但是我必须考虑如果存在一些非法名称并且程序变长怎么办。
我想做的只是简单地比较整个字符串,相同的字符必须具有相同的数字。但是当我执行 [@"word" intValue] 时,如果字符串不是数字,则结果为零。我想知道是否有一种将字符串转换为数字的好方法。
看一下NSString
的方法:
- (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask
和NSNumericSearch
选项。
如果您想自己对它们进行排序,则需要使用
- (NSComparisonResult)compare:(NSString *)aString;
常规。
这是对支持 NSComparisonResult 的输出的引用。
These constants are used to indicate how items in a request are ordered.
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
常量:NSOrderedAscending 左操作数小于右操作数。
NSOrderedSame 两个操作数相等。
NSOrderedDescending 左操作数大于右操作数。
如果您认为它更容易,您可以用分隔的字符串填充 NSArray,然后使用类似以下的内容:
sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
链接到来自 SO 的良好 QA:
在你的情况下,我能想到的最后一种方法。那就是使用 NSString 的 hasPrefix 方法来确保每个字符串都以“filename_”开头作为第一个验证。之后对整个字符串进行子串化,然后在“filename_”之后获得剩余的字符串。如果所有文件名的数字都为 1 或更大,则 0 表示此时字符串无效,否则 intValue 应返回有效的正整数,您可以通过整数值进行排序。
这应该有效:
NSString *good = @"filename_1";
NSString *bad = @"filename";
NSCharacterSet *letterSet= [NSCharacterSet letterCharacterSet];
good = [good stringyByTrimmingCharactersInSet:letterSet]; // 1
bad = [bad stringByTrimmingCharactersInSet:letterSet]; // <empty>
您可以使用以下 coe 对包含文件对象列表的数组进行排序:
NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"fileName" ascending:YES];
[arrayOfFileNames sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];
希望这对你有帮助...
我认为你不能将它与 NSString 进行比较,因为 NSString 遵循 1,10,11,12,13,14 .....2,20,21,22 ......这种类型的升序,而整数如下0,1,2,3,4,5,6,7.......等等......所以你必须从字符串中分割最后一个字符然后必须进行比较。
以及如何按升序缩短字符串....
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"f_1",@"f_2",@"f_12",@"f_6",@"f_9",@"f_4", nil];
NSSortDescriptor *name = [[[NSSortDescriptor alloc] initWithKey:@"" ascending:YES] init];
[array sortUsingDescriptors:[NSMutableArray arrayWithObjects:name, nil]];
但这会给你字符串短路而不是根据数字。
谢谢你!