【问题标题】:how to sort an array of dictionaries depending on several properties of the dictionary如何根据字典的几个属性对字典数组进行排序
【发布时间】:2012-08-03 23:08:21
【问题描述】:

我需要使用字典中的键控对象对字典数组进行排序(尽可能接近快速排序),但是由于我的字典的复杂性(键值的数量)和可以返回的数据他们我需要能够根据字典中的几个键值对每个字典进行排序。

例如,如果 array[0], array[1] 中的字典 keyvalue1 相等,则检查 keyvalue2 是否相等,如果是,则继续向下键值列表直到您可以对 array[0 进行排序的两项] & [1] 开启。

我已阅读有关 NSSortDescriptor 并指定属性以与您可以设置升序或降序的位置进行比较,但我不确定这是否可用于实现我想要实现的目标。

我得到了一个我需要做的例子,但它是在我不太熟悉的 delphi 中,但我认为这个例子对我正在尝试做的事情提供了一些见解。

//
Result := AnsiCompareText (left.property1, right.Property1);
if Result <> 0 then Exit;
Result := AnsiCompareText (left.property2, right.Property2);
if Result <> 0 then Exit;
Result := AnsiCompareText (left.property3, right.Property3);
if Result <> 0 then Exit;
Result := AnsiCompareText (left.property4, right.Property4);
if Result <> 0 then Exit;
Result := AnsiCompareText (left.property5, right.Property5);
if Result <> 0 then Exit;
//

希望这会给您一些关于我想要实现的目标的想法,如果您知道目标 C 中的类似解决方案,我很乐意听到任何帮助。 ! :P

【问题讨论】:

    标签: iphone ios nsarray nsdictionary nssortdescriptor


    【解决方案1】:

    假设您有一个可变数组。然后你用这个:

    [myArray sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
    {
      // you have two items - use whatever complex logic you want, then return
      // one of NSOrderedAscending, NSOrderedSame, NSOrderedDescending
    } ];
    

    例如,假设您只关心“名称”属性:

    [myArray sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
    {
      NSString *n1 = [d1 objectForKey:@"name"];
      NSString *n2 = [d2 objectForKey:@"name"];
      return [n1 localizedCompare:n2];
    } ];
    

    这种技术的真正好处是逻辑可以任意复杂。

    【讨论】:

    • 只是一个关于您的代码的问题,我是否需要将其放入某种类型的循环或剂量 sortUsingComparator 循环遍历数组(即将成为可变数组)并将每个字典对象放入 d1 然后 d2,等等等等,比如快速排序?或者这只是一个包含 2 个字典对象的数组?
    • 啊,对了,在搜索 NSComparisonResult 后,我​​刚刚看到了与您的第二段代码类似的示例 :) 我的最后一个问题是,如果 d1 和 d2 中的名称相同,然后我想 stort使用姓氏..逻辑是什么样子..我不确定返回将如何工作或如何构建..这个..我希望这是有道理的
    • 因此,如果两个名称相等,即比较结果为“NSOrderedSame”,则进行另一个比较,然后返回升序或降序,或者如果它们相等,则进行另一个比较。这样做你可以得到相当深的缩进,所以如果不一样,你只需先返回,然后你可以继续相同的缩进级别。块中的内容只是普通的 ole 普通代码。
    猜你喜欢
    • 2018-09-27
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多