使用对象订购NSArray

时间:2014-10-28 15:07:38

标签: ios objective-c sorting nsarray

我的 NSDictionary 包含以下数据:

(lldb) po allFriends
{
    71685207018702188 =     {
        id = 71685207018702188;
        name = "mikeziri ";
        username = mi;
    };
    93374822540641772 =     {
        id = 93374822540641772;
        name = "Alan Weclipse";
        username = zuka;
    };
    96553685978449395 =     {
        id = 96553685978449395;
        name = "Monica Weclipse";
        username = amonica;
    };
    96556113096345076 =     {
        id = 96556113096345076;
        name = Xavier;
        username = branko;
    };
    97017008427632119 =     {
        id = 97017008427632119;
        name = "Dario Weclipse";
        username = tarzan;
    };
}

我根据名称对这些对象进行排序,如果他们没有名称,我会使用用户名< / strong>即可。为此,我使用名称 id 创建一个新的 NSDictionary ,并在方法的末尾按名称对其进行排序即可。对它们进行排序的代码如下:

- (NSArray*)orderFriends
{
    NSMutableDictionary* newFriendsDict = [[NSMutableDictionary alloc] init];

    for (int i=0; i<[allFriends count];i++)
    {
        NSMutableDictionary* friendsDict = [[NSMutableDictionary alloc] init];
        NSDictionary* friend = [allFriends objectForKey:[NSString stringWithFormat:@"%@", [sortedKeysFriends objectAtIndex:i]]];

        if ([[friend objectForKey:@"name"] length] != 0)
        {
            [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"];
            [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"name"]] forKey:@"name"];
        }
        else
        {
            [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"];
            [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"username"]] forKey:@"name"];
        }

        [newFriendsDict setObject:friendsDict forKey:[NSNumber numberWithInt:i]];
    }

    NSArray* sp = nil;
    sp = [[newFriendsDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2){
        NSString *one = [NSString stringWithFormat:@"%@", [obj1 objectForKey:@"name"]];
        NSString *two = [NSString stringWithFormat:@"%@", [obj2 objectForKey:@"name"]];

        return [one compare:two];
    }];

    return sp;
}

问题是最终结果是错误的:

(lldb) po sp
<__NSArrayI 0x160491a0>(
{
    id = 93374822540641772;
    name = "Alan Weclipse";
},
{
    id = 97017008427632119;
    name = "Dario Weclipse";
},
{
    id = 96553685978449395;
    name = "Monica Weclipse";
},
{
    id = 96556113096345076;
    name = Xavier;
},
{
    id = 71685207018702188;
    name = "mikeziri ";
},
)

3 个答案:

答案 0 :(得分:1)

区分大小写。使所有字符串变小或变大。

答案 1 :(得分:1)

您也可以更改
return [one compare:two];

return [one compare:two options: options:NSCaseInsensitiveSearch];

不管是大写还是小写,都会按字母顺序排序......

答案 2 :(得分:1)

有几点:没有理由为了排序而构建不同的词典,并且有充分的理由不这样做。

您已经找到了sortedArrayUsingComparator方法。这需要一个用于比较对象对的块,并返回一个已排序的数组。您可以使用该方法来实现所需的任何排序条件。

我建议编写一个比较器块来比较对象的名称属性,除非它是空白的,如果空白,则使用用户名。它只是几行代码:

NSArray *sortedFriends = [[allFriends allValues] sortedArrayUsingComparator:
                          ^(NSDictionary *obj1, NSDictionary *obj2)
{
    NSString* key1 = obj1[@"name"] ? obj1[@"name"] : obj1[@"username"];
    NSString* key2 = obj2[@"name"] ? obj2[@"name"] : obj2[@"username"];
    return [key1 caseInsensitiveCompare: key2];
}];
编辑:我刚刚注意到(从你的帖子编辑)你是从字典开始,而不是数组。那么你想要做的是创建一个包含字典中所有值的排序数组?是否可以丢弃字典中所有项目的键,并最终得到值的排序数组?

您可以做的另一件事是构建一个字典键数组,根据您的排序条件进行排序。然后,您可以使用键数组按排序顺序从字典中获取项目。