2013-07-16 108 views
0

我有一個數組(seachResult),它包含字典,我想根據字典中的'價格'鍵對數組進行排序,字典是字符串格式的數字。 我試過這段代碼,但它不能用於排序'價格',但它適用於這是一個數字的pid。 如何根據「價格」(字符串格式的數量)對其進行分類?排序字典數組問題

NSSortDescriptor *sortByPrice = [NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortByPrice]; 
    NSArray *sortedArray = [self.seachResult sortedArrayUsingDescriptors:sortDescriptors]; 
    NSLog(@"%@",sortedArray); 

這裏是採樣數據爲self.searchResult:

2013-07-17 02:04:55.012 MyApp[57014:16a03] sorted array of dictionaries: (
    { 
    cid = 2; 
    image = "http:///images/loginlogo.png"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"; 
    pcode = 023942435228; 
    pid = 1; 
    pname = "example product"; 
    price = "12.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "0.00"; 
    text = "here is text about sample product number 1...\nasdasdasda\nsdfsdfsd\nSdfsdf\nSDfsdfs\ndfsdfsdf\n\n\n"; 
}, 
    { 
    cid = 2; 
    image = "http:///testImage.png"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 2; 
    pname = "sample product 2"; 
    price = "126.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 1; 
    "sale_percent" = 20; 
    "sale_price" = "99.99"; 
    text = "here is text about sample product number 2...\nblah blah blah\nasdasdasd\nASdasdas\nASdasdasd"; 
}, 
    { 
    cid = 1; 
    image = ""; 
    latitude = ""; 
    longitude = ""; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 3; 
    pname = "test product"; 
    price = "46.00"; 
    qrcode = ""; 
    rid = 2; 
    rname = ""; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "35.00"; 
    text = "some text here... 

\ nasdasd \ NASD \吶 \ NSD \ NAS \ ND「; } )

我也試過這個代碼:

NSSortDescriptor *hopProfileDescriptor = 
    [[NSSortDescriptor alloc] initWithKey:@"price" 
           ascending:YES]; 

    NSArray *descriptors = [NSArray arrayWithObjects:hopProfileDescriptor, nil]; 
    NSArray *sortedArrayOfDictionaries = [self.seachResult 
              sortedArrayUsingDescriptors:descriptors]; 

    NSLog(@"sorted array of dictionaries: %@", sortedArrayOfDictionaries); 

但仍然無法正常工作。

+2

記錄數組 - 該代碼看起來正確。 –

+0

你能告訴我們什麼是self.searchResult?我用我自己的輸入數據嘗試了你的代碼,它工作得很好。 –

+0

當然,我已經更新了問題 – John

回答

2

我認爲問題是,在您的self.searchResult陣列中,price數據對陣列中的對象格式不同。

數組中的第一個對象按照以下格式price = 12;(可能是NSDecimalNumber

採用以下格式price = "125.99";(proably一個NSString

NSArray *testSorted = [test sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) { 

     NSString *price1 = obj1[@"price"]; 
     NSString *price2 = obj2[@"price"]; 

     NSNumber *n1 = [NSNumber numberWithFloat:[price1 floatValue]]; 
     NSNumber *n2 = [NSNumber numberWithFloat:[price2 floatValue]]; 

     return [n1 compare:n2]; 
    }]; 
+0

是的,你是正確的,我改變了代碼,它可以很好地通過pid進行排序,這是一個數字,但是當我將其更改爲數字排序的價格時,但是以字符串格式排序它不起作用。 我該怎麼辦? – John

+0

我認爲你應該確保檢查實際價格是多少。因爲就像我寫的,它似乎是在你的數組輸出中的兩個不同的類。爲了能夠按照您希望排序的方式對數組進行排序,價格對象需要具有相同的類。 –

+0

它來自mysql數據庫,它定義爲Varchar那裏,輸出是在json和app從json數據讀取的。 我怎樣才能讓他們一樣? – John

0

由於數組中的第二個對象的價格數據似乎要改變(NSString vs NSNumber),你可以嘗試使用sortedArrayUsingComparator :.例如:

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    id value1 = [obj1 objectForKey:@"price"]; 
    float float1 = [value1 floatValue]; 
    id value2 = [obj2 objectForKey:@"price"]; 
    float float2 = [value2 floatValue]; 
    if (float1 < float2) { 
     return NSOrderedAscending; 
    } 
    else if (float1 > float2) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
}]; 

這有點不好,但應該讓你開始。它也很脆弱 - 如果你爲NSNumber或NSString以外的價格購買其他產品,它可能會崩潰。

+0

謝謝,是的,這是正確的方式,對不起,我沒有足夠的信貸投票了 – John