使用对象排序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;
    };
}

我根据名称对这些对象进行排序,如果它们没有姓名,我将使用用户名。为此,我创建了一个新的NSDictionary,名称为nameid。在方法结束时,我按name对它们进行排序。对它们进行排序的代码如下:

- (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 ";
},
)

区分大小写。把所有的绳子都做成小的或大的。

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

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

然后它将按字母顺序排列,无论大小写。。。

几件事:没有理由为了排序而构建不同的字典,也有充分的理由不这样做。

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

我建议编写一个比较器块来比较对象的名称属性,除非它为空,否则使用username。只有几行代码:

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];
}];

编辑:我刚刚注意到(从你对我帖子的编辑中)你是从字典开始的,而不是从数组开始的。那么,您想做的是创建一个字典中所有值的排序数组?丢弃字典中所有项的键,最后得到一个值的排序数组,这可以接受吗?

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

最新更新