0

我对目标 c 很陌生,我的代码有点问题。我有一个包含世界国家列表的数组。现在我想根据字母表从该数组中创建一些字典,然后将所有这些字典放在一个数组中,例如:

这是我的国家/地区数组:

  • “阿富汗”
  • “阿尔巴尼亚”
  • “阿尔及利亚”
  • “安哥拉”
  • “阿根廷”
  • “巴哈马”
  • “古巴”
  • “丹麦”

从那个数组我想创建这个:

          NSArray


          NSDictionary{
                        headerTitle: "A"
                        rowValue: ("Argentina", "Albania", "Algeria"....etc)
                       }


          NSDictionary {
                        headerTitle: "B"
                        rowValue: ("Bahamas", "Bahrain", "Bangladesh"....etc)
                       }

                      etc...

现在我无法对此进行硬编码,因为自从我从网络服务器获取国家/地区数组以来,国家/地区列表一直在变化。如果你们能告诉我如何从我的国家/地区获取这个字典数组(按字母顺序),我将不胜感激。谢谢你。

4

3 回答 3

0
@implementation NSArray (CountryNamesArray)

+(NSArray*)sectionsArrayFromCountryNames:(NSArray*)countryNames
{
        NSMutableDictionary * countriesDict = [ NSMutableDictionary dictionary ] ;

        for( NSString * countryName in countryNames )
        {
            NSString * firstLetter = [ [ countryName substringToIndex:1 ] uppercaseString ] ;
            NSDictionary * countryDict = countriesDict[ firstLetter ] ;
            if ( ! countryDict ) { countryDict = @{ @"headerTitle" : firstLetter, @"rowValues" : [ NSMutableArray array ] }; } ;

            [ countryDict[@"rowValues"] addObject:countryName ] ;
        }

        return [ countriesDict allValues ] ;
}

@end

这是 NSArray 上的一个类别,可以满足您的需求。

像这样使用

NSArray * countriesArray = [ NSArray sectionsArrayFromCountryNames:<#countryNames#> ];

但是,我认为更好的方法可能是对部分名称进行排序,并且部分名称是字典中的键,其值是每个部分的行。像这样:

// protocol all your cells will support
@protocol TableViewCell
@property ( nonatomic, strong ) id value ;  // value cell should display in table
+(NSString*)reuseIdentifier ;
+(instancetype)cell ;
@end

@interface TableViewCell : UITableViewCell<TableViewCell>
@end

@implementation TableViewCell

@synthesize value = _value ;

-(void)setValue:(id)value
{
    _value = value ;
    self.textLabel.text = value ;
}

+(NSString*)reuseIdentifier
{
    return NSStringFromClass( self ) ;
}

+(instancetype)cell
{
    return [[ [ self class ] alloc ] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[ self reuseIdentifier ] ] ;
}

@end

@interface TableViewDataSource ()
@property ( nonatomic, strong ) NSArray * cityNames ;
@property ( nonatomic, strong ) NSArray * sectionTitles ;
@property ( nonatomic, strong ) NSMutableDictionary * sectionsDictionary ;
@end

@implementation TableViewDataSource

-(void)setCityNames:(NSArray*)names
{
    NSMutableSet * sectionTitles = [ NSMutableSet set ] ;
    NSMutableDictionary * newSectionsDict = [ NSMutableDictionary dictionary ] ;

    for( NSString * cityName in names )
    {
        NSString * sectionTitle = [[ cityName substringToIndex:1 ] uppercaseString ] ;
        [ sectionTitles addObject:sectionTitle ] ;
        NSMutableArray * sectionRows = newSectionsDict[ sectionTitle ] ;
        if ( !sectionRows )
        {
            sectionRows = [ NSMutableArray arrayWithObject:cityName ] ;
            newSectionsDict[ sectionTitle ] = sectionRows ;
        }
        else
        {
            [ sectionRows addObject:cityName ] ;
        }
    }

    self.sectionTitles = [[ sectionTitles allObjects ] sortedArrayUsingSelector:@selector( compare: ) ] ;
    self.sectionsDictionary = newSectionsDict ;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.sectionTitles.count ;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [ self.sectionsDictionary[ self.sectionTitles[ section ] ] count ] ;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Class<TableViewCell> cellClass = [ TableViewCell class ] ;  // 'cellClass' could change based on type of value to be displayed
    TableViewCell * cell = [ tableView dequeueReusableCellWithIdentifier:[ cellClass reuseIdentifier ] ] ;
    if ( !cell )
    {
        cell = [ cellClass cell ] ;
    }
    cell.value = self.sectionsDictionary[ self.sectionTitles[ indexPath.section ] ][ indexPath.row ] ;
    return cell ;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return self.sectionTitles[ section ] ;
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return self.sectionTitles ;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return index ;
}

@end
于 2013-10-11T01:06:58.687 回答
0

创建一个节数组:

NSArray* sectionArray = [NSArray arrayWithArray: [@"A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|#" componentsSeparatedByString:@"|"]];

取第一个字母,在使用子字符串之前使用检查:

NSString *firstLetter = [strValue substringToIndex:1];

将其添加到正确的部分数组中,因此最后您应该有 27 个键 Dict,其中数组作为对象。希望这可以帮助!

请注意,没有直接的方法可以做到这一点。

于 2013-10-11T00:25:16.063 回答
0

我很快把这个伪代码放在一起,但这使用字典而不是你要求的数组。希望能帮助到你。

    NSMutableDictionary *countryFirstLetters = [NSMutableDictionary dictionary];
    for (NSString *countryName in countries)
    {
        NSString *firstLetter = [[countryName substringToIndex:1] uppercaseString];
        NSMutableDictionary *firstLetterDict = countryFirstLetters[firstLetter];
        if (!firstLetterDict)
        {
            firstLetterDict = [NSMutableDictionary dictionary];
        }
        firstLetterDict[@"headerTitle"] = firstLetter;

        NSMutableString *rowValueString = firstLetterDict[@"rowValue"];
        if (!rowValueString)
        {
            rowValueString = [[NSMutableString alloc] initWithString:countryName];
        }
        else
        {
            [rowValueString appendFormat:@", %@", countryName];
        }
        firstLetterDict[@"rowValue"] = rowValueString;

        countryFirstLetters[firstLetter] = firstLetterDict;
    }
于 2013-10-11T00:52:46.893 回答