data (
{
"name" = "Conway";
"country" = "England";
},
{
"name" = "Bale";
"country" = "Wales";
},
{
"name" = "Stephens";
"country" = "Scotland";
},
{
"name" = "Michael";
"country" = "England";
},
{
"name" = "Pedro";
"country" = "Spain";
},
{
"name" = "Patrick";
"country" = "England";
},
{
"name" = "John";
"country" = "Ireland";
},
{
"name" = "Bob";
"country" = "Ireland";
}
)
我有一个我正在解析的JSON数组。目标是在选择器视图中显示此内容。但是选择器视图是自定义的,列表将如下所示:
**Ireland**
John
Bob
**England**
Conway
Michael
Patrick
等等。
然而,正如您所看到的,要解析的JSON没有很好地组织并由标题分隔,所以我很乐意在应用程序中执行此操作:(但我正在接受挑战。
我有一个玩家对象。
Player.h
NSString * name;
NSString * country;
BOOL isHeader;
下面的代码块用于遍历下载的JSON的内容。我目前的实现并不理想,有点令人困惑。但我无法想到任何其他方式,我总是愿意接受解决方案,以更快的方式做到这一点。
我遍历内容,如果它是第一次完成对象,则isHeader设置为true。
最终的数组是包含初始数组中的所有对象,但按国家/地区分类,国家标题也设置为Player
对象,但isHeader
为真。我愿意采取其他方式来做到这一点。每个对象的最终目标是使用标题分隔。我最好也喜欢使用一系列对象,但愿意接受更好的练习建议。
for (int i=0; i < mArray.count; i++) {
if (i==0) {
Player * pPlayer = mArray[i];
pPlayer.isHeader=YES;
[headerArray addObject:pPlayer];
[catArray addObject:pPlayer];
}
else{
BOOL newHeader=YES;
for (int j=0; j<headerArray.count; j++) {
Player * jPlayer =mArray[i];
Player * headerPlayer = headerArray[j];
if ([headerPlayer.country isEqualToString:jPlayer.country]) {
newHeader=NO;
jPlayer.isHeader=NO;
[catArray addObject:jPlayer];
}
}
if (newHeader==YES) {
Player * hPlayer = mArray[i];
hPlayer.isHeader=YES;
[headerArray addObject:hPlayer];
[catArray addObject:hPlayer];
}
}
}
for (int k=0; k<headerArray.count; k++) {
[finalArray addObject:headerArray[k]];
for (int y=0; y<catArray.count; y++) {
Player *cPlayer = catArray[y];
Player *hPlayer = headerArray[k];
if ([hPlayer.country isEqualToString:cPlayer.country]) {
[finalArray addObject:cPlayer];
}
}
}
目前的结果是:
**Ireland**
**Ireland**
Bob
**England**
**England**
Michael
Patrick
因此我的条件陈述肯定是错误的。
答案 0 :(得分:1)
NSMutableDictionary *players = [NSMutableDictionary dictionary];
for(Player *player in mArray) {
NSString *country = player.country;
NSMutableArray *playersArray = players[country];
if(!playersArray) {
playersArray = [NSMutableArray array];
}
[playersArray addObject:player.name];
players[country] = playersArray;
}
我认为应该这样做,虽然我承认我没有测试过。
正如Droppy所说,如果你想要订购标题,你必须把它们放在一个数组中。您可以通过[players allKeys];
获取标头,然后使用sortUsingComparator:
对其进行排序 - 然后遍历players
字典,从排序后的数组中依次获取每个密钥。