我的 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 ";
},
)
答案 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];
}];
编辑:我刚刚注意到(从你的帖子编辑)你是从字典开始,而不是数组。那么你想要做的是创建一个包含字典中所有值的排序数组?是否可以丢弃字典中所有项目的键,并最终得到值的排序数组?
您可以做的另一件事是构建一个字典键数组,根据您的排序条件进行排序。然后,您可以使用键数组按排序顺序从字典中获取项目。