0

我需要根据 "_" 之后的数字对文件列表进行排序:

"filename_1" "filename_2" ......

我知道我可以提取数字,然后用数字对文件名进行排序,但是我必须考虑如果存在一些非法名称并且程序变长怎么办。

我想做的只是简单地比较整个字符串,相同的字符必须具有相同的数字。但是当我执行 [@"word" intValue] 时,如果字符串不是数字,则结果为零。我想知道是否有一种将字符串转换为数字的好方法。

4

5 回答 5

2

看一下NSString的方法:

- (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask

NSNumericSearch选项。

于 2012-06-28T05:32:40.443 回答
1

如果您想自己对它们进行排序,则需要使用

- (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:

如何按字母顺序对 NSArray 进行排序?

在你的情况下,我能想到的最后一种方法。那就是使用 NSString 的 hasPrefix 方法来确保每个字符串都以“filename_”开头作为第一个验证。之后对整个字符串进行子串化,然后在“filename_”之后获得剩余的字符串。如果所有文件名的数字都为 1 或更大,则 0 表示此时字符串无效,否则 intValue 应返回有效的正整数,您可以通过整数值进行排序。

于 2012-06-28T05:38:44.683 回答
0

这应该有效:

NSString *good = @"filename_1";
NSString *bad = @"filename";

NSCharacterSet *letterSet= [NSCharacterSet letterCharacterSet];

good = [good stringyByTrimmingCharactersInSet:letterSet]; // 1
bad = [bad stringByTrimmingCharactersInSet:letterSet]; // <empty>
于 2012-06-28T05:34:28.120 回答
0

您可以使用以下 coe 对包含文件对象列表的数组进行排序:

NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"fileName" ascending:YES];
[arrayOfFileNames sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];

希望这对你有帮助...

于 2012-06-28T05:35:21.120 回答
0

我认为你不能将它与 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]];

但这会给你字符串短路而不是根据数字。

谢谢你!

于 2012-06-28T05:40:20.283 回答