【问题标题】:How to filter a dictionary of arrays如何过滤数组字典
【发布时间】:2011-02-10 00:10:40
【问题描述】:

我有一个数组字典,我想根据数组中的元素对其进行过滤。我的字典是这样的……

"Abu Dhabi, U.A.E." =     (
    "24.466665",
    "54.416668",
    "Asia/Dubai"
);
"Accra, Ghana" =     (
    "5.583333",
    "-0.100000",
    "Africa/Accra"
);
"Adak, America" =     (
    "",
    "",
    "America/Adak"
);
"Addis Ababa, Ethiopia" =     (
    "9.050000",
    "38.700001",
    "Africa/Addis_Ababa"
);

我想根据第三项过滤字典,例如第三项(时区 ID)为“America/Adak”的所有键。

我想我可以用 keysOfEntriesPassingTest 做到这一点,但我不知道如何做到这一点。我找到了一些示例代码...

mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
             if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                 return YES;
             else
                 return NO;
             }]

但我无法弄清楚如何重写它以适应我的情况。我不明白所需的语法。

有人可以帮我弄清楚如何实现这个过滤器吗?

谢谢,约翰

【问题讨论】:

    标签: iphone xcode filter nsdictionary predicate


    【解决方案1】:
        mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                     if ([[obj objectAtIndex:2] isEqualToString:@"America/Adak"]) {
                         return YES;
                     } else {
                         return NO;
                     } 
                    }];
    

    请注意,正如方法名称所暗示的,结果集将只包含键,而不是数组本身。

    【讨论】:

    • 再次感谢。任何机会你都可以帮助我理解该方法的语法。什么是 keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) 试图告诉我。 Obj 必须是存储的对象,但是您将如何使用 key 以及 BOOL *stop 是什么?好的,我想我明白了...我可以使用 key 来测试 key 是否匹配包含或开头的某种匹配。我认为 stop 可以用来在找到第一个匹配项时停止过滤???不太清楚如何使用停止。
    • 方法keysOfEntriesPassingTest: 将遍历您的字典,并为字典中存储的每个对象调用一次大括号中的代码块。在块中,您可以使用key 获取当前值的key(例如在您的情况下为@"Adak, America"),obj 是值本身,stop 是一种告诉方法在某个点停止迭代。所以是的,它像你想象的那样工作。对于块返回YES 的每个对象,该方法将对象的键存储在它最终返回给您的集合中。
    【解决方案2】:

    Ole,谢谢你!!

    我发现的示例代码中的 if 语句格式不正确。我认为您只为我修改了相关部分。为了其他人看到这个问题的利益,这是最终的工作代码......

    mySet = [citiesDictionary keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) 
             {
                 if([[obj objectAtIndex:2] isEqualToString:@"America/Adak"]){
                     return YES;
    
                 }else {
                     return NO;
                 }
             }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多