条件语句:使用数组中的对象标题分隔自定义对象(代码示例)

时间:2014-12-08 12:43:49

标签: objective-c nsmutablearray conditional-statements

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

因此我的条件陈述肯定是错误的。

1 个答案:

答案 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字典,从排序后的数组中依次获取每个密钥。