【问题标题】:iOS Is there a way to sort an NSDictionary's keys by 2 values?iOS 有没有办法按 2 个值对 NSDictionary 的键进行排序?
【发布时间】:2017-08-02 23:16:30
【问题描述】:

假设我有这个 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"]
};

希望这是有道理的,有人有答案。 谢谢

【问题讨论】:

  • 字典不可排序。
  • @rmaddy,标题中用词不当。 OP 想要一个排序后的键数组。
  • 我将改写标题。对此感到抱歉
  • 实际上,我不知道该怎么说。 @danh 有什么建议吗?
  • 我通过编辑标题提出了一个建议

标签: ios objective-c arrays sorting dictionary


【解决方案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;
}];

【讨论】:

  • 完美无瑕。谢谢!
【解决方案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;
}];

【讨论】:

  • 嘿,我不得不选择另一个答案,因为它与您的答案相同,但它比您的答案早 6 秒。我赞成你的。谢谢!
  • 我也看到了这个答案。但是当他写 [obj1[1] compare:obj2[1]] 时它是错误的,它首先显示较旧的时间戳。然后他进行了编辑以使其正确。不过没关系。
  • 我也赞成,因为您认识到 OP 所需的排序是递减的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2023-03-25
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多