2017-03-13 47 views
1

假設我有這樣的NSDictionary:iOS有沒有辦法按2個值排序NSDictionary的鍵?

NSDictionary *d = @{ 
        @"124":@[@"-40",@"1489365614.248664"], 
        @"130":@[@"-40",@"1489365604.258358"], 
        @"134":@[@"-40",@"1489365615.49739"], 
        @"53":@[@"-40",@"1489365610.502131"], 
        @"57":@[@"-40",@"1489365609.253352"], 
        @"73":@[@"-40",@"1489365608.004844"], 
        @"89":@[@"-44",@"1489365611.750874"], 
        @"91":@[@"-64",@"1489365606.755874"], 
        @"93":@[@"-45",@"1489365605.507149"], 
        @"96":@[@"-45",@"1489365613.000054"] 
        }; 

我可以在陣列像這樣的第一個值對其進行排序:

NSArray *sortedKeys = [d keysSortedByValueUsingComparator: ^(NSArray *obj1, NSArray *obj2) { 
    return (NSComparisonResult)[obj1[0] compare:obj2[0]]; 
}]; 

,並返回該數組:

@[73,134,53,124,130,57,89,96,93,91] 

這翻譯成字典是這樣的:

@{ 
@"73": @[@"-40",@"1489365608.004844"], 
@"134":@[@"-40",@"1489365615.49739"], 
@"53": @[@"-40",@"1489365610.502131"], 
@"124":@[@"-40",@"1489365614.248664"], 
@"130":@[@"-40",@"1489365604.258358"], 
@"57": @[@"-40",@"1489365609.253352"], 
@"89": @[@"-44",@"1489365611.750874"], 
@"96": @[@"-45",@"1489365613.000054"], 
@"93": @[@"-45",@"1489365605.507149"], 
@"91": @[@"-64",@"1489365606.755874"] 
}; 

現在,正如您可能想象的那樣,字典中數組的第二個值是一個時間戳。如果第一個值相等,我想按這個時間戳排序,所以我可以先找到最新的值。

如果我能做到這一點,我要回去了一個這樣的數組:

@[134,124,53,57,73,130,89,96,93,91] 

這將翻譯詞典實際上是這樣的:

@{ 
@"134":@[@"-40",@"1489365615.49739"], 
@"124":@[@"-40",@"1489365614.248664"], 
@"53": @[@"-40",@"1489365610.502131"], 
@"57": @[@"-40",@"1489365609.253352"], 
@"73": @[@"-40",@"1489365608.004844"], 
@"130":@[@"-40",@"1489365604.258358"], 
@"89": @[@"-44",@"1489365611.750874"], 
@"96": @[@"-45",@"1489365613.000054"], 
@"93": @[@"-45",@"1489365605.507149"], 
@"91": @[@"-64",@"1489365606.755874"] 
}; 

希望它使感覺和某人有答案。 感謝

+0

Dictionary不排序。 – rmaddy

+0

@rmaddy,標題中的選詞不恰當。 OP想要一個有序的數組。 – danh

+0

我會重新命名標題。對不起, – Jan

回答

1

如果有一條領帶,只是比較的第二個值...

NSArray *sortedKeys = [d keysSortedByValueUsingComparator: ^(NSArray *obj1, NSArray *obj2) { 
    NSComparisonResult result = [obj1[0] compare:obj2[0]]; 
    return (result == NSOrderedSame)? [obj2[1] compare:obj1[1]] : result; 
}]; 
+0

無瑕。謝謝! – Jan

2

使用此邏輯:

NSArray *sort = [d keysSortedByValueUsingComparator:^(NSArray *obj1, NSArray *obj2) { 
    NSComparisonResult result = [obj1[0] compare:obj2[0]]; 
    if (result == NSOrderedSame) { 
     result = [obj2[1] compare:obj1[1]]; 
    } 
    return result; 
}]; 
+0

嘿,我不得不選擇其他答案,因爲它與你的答案相同,但它是在你的6秒之前完成的。我雖然贊成你的。謝謝! – Jan

+1

我也看到了答案。但是當他寫[obj1 [1] compare:obj2 [1]]時,它首先顯示了較早的時間戳,這是錯誤的。然後他編輯,以使其正確。但沒關係。 –

+0

我也投票,因爲你認識到OP的期望排序是降序。 – danh

相關問題