2014-03-05 61 views
0

串像排序字符串包含数字,NSMutableArray里与字典

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

字典的键值在NsMutableArray,我试图通过英里然后结石的量对它们进行排序。

定期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]; 
} 

不工作。

我必须解析字符串获取数字然后排序吗?还是有更简单的方法来排序呢?

+0

我可能会创建一个自定义类,它们将这些值保存为数字类型,并简单地覆盖用这种格式打印的“description”方法,而不是试图将数据作为字符串进行存储和排序。 – nhgrif

+0

什么是关键,什么值? – vikingosegundo

回答

0

你的方法是正确的,

我已经试过你的

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]; 
} 
+0

是的,该死的后突破点我已经看到,我发送空字符串 –

1

这里是如何做到这一点的最好,面向对象的方式。

首先。创建一个班级。让我们把它叫做MyObject

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

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

@end 

正如你所看到的,它有一个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") 

它的工作原理就像一个魅力我的朋友!

相关问题