繁体   English   中英

排序字符串包含数字,带有字典的NSMutableArray

[英]Sort string contains numbers, NSMutableArray with Dictionaries

"4 Miles 400 stones"
"2 Miles 10 stones"
"6 Miles 2 Stones" 

NsMutableArray中dictionary的一个关键值,我试图按英里数和石头数对它们进行排序。

常规sortUsingDescriptor

[list sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"systems" ascending:YES], nil]];

NSNumericSearch

NSMutableArray *newList;
        NSArray *result = [list sortedArrayUsingFunction:&sort context:@"systems"];
        newList= [[NSMutableArray alloc] initWithArray:result];

NSInteger sort(id a, id b, void* p) {
    return [[a valueForKey:(__bridge NSString*)p]
            compare:[b valueForKey:(__bridge NSString*)p]
            options:NSNumericSearch];
}

不工作。

我是否必须解析字符串获取数字然后对其进行排序? 还是有一种更简单的方法来对此分类?

这是最佳的,面向对象的方法。

第一。 创建一个类。 我们称之为MyObject

@interface MyObject : NSObject
@property(nonatomic, assign) NSUInteger miles;
@property(nonatomic, assign) NSUInteger stones;

+ (MyObject *)objectWithString:(NSString *)string;

@end

如您所见,它具有一个objectWithString ,我们将使用它使用字符串中的信息来创建对象: "4 Miles 400 stones" objectWithString "4 Miles 400 stones"

@implementation MyObject

+ (MyObject *)objectWithString:(NSString *)string
{
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[0-9]+?(?= Miles | stones)" options:0 error:nil];
    NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];

    MyObject *myObject = [[MyObject alloc] init];

    myObject.miles = [[string substringWithRange:((NSTextCheckingResult *)matches[0]).range] integerValue];
    myObject.stones = [[string substringWithRange:((NSTextCheckingResult *)matches[1]).range] integerValue];

    return myObject;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"%d miles, %d stones", self.miles, self.stones];
}

@end

然后,我们将使用NSSortDescriptor对数组进行排序:

MyObject *myObject1 = [MyObject objectWithString:@"4 Miles 400 stones"];
MyObject *myObject2 = [MyObject objectWithString:@"2 Miles 10 stones"];
MyObject *myObject3 = [MyObject objectWithString:@"6 Miles 2 stones"];

NSArray *array = @[myObject1, myObject2, myObject3];

NSSortDescriptor *miles = [[NSSortDescriptor alloc] initWithKey:@"miles" ascending:YES];
NSSortDescriptor *stones = [[NSSortDescriptor alloc] initWithKey:@"stones" ascending:YES];
NSArray *sortDescriptors = @[miles, stones];

NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];

NSLog(@"Sorted: %@", sortedArray);

并输出:

2014-03-05 19:51:54.233 demo[12267:70b] Sorted: (
    "2 miles, 10 stones",
    "4 miles, 400 stones",
    "6 miles, 2 stones" )

它就像我的朋友一样魅力!

您的方法是正确的,

我已经尝试过

NSInteger sort(id a, id b, void* p) {
    return [[a valueForKey:(__bridge NSString*)p]
            compare:[b valueForKey:(__bridge NSString*)p]
            options:NSNumericSearch];
}

它排序正确,请确保您调用正确的字典值或正确的方法,放置一些断点,您可能正在发送空值或其他内容。

如果您想反向搜索,请使用

NSInteger reverseSort(id a, id b, void* p) {
    return - [[a valueForKey:(__bridge NSString*)p]
            compare:[b valueForKey:(__bridge NSString*)p]
            options:NSNumericSearch];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM