2014-03-05 62 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") 

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

相關問題