如何将NSArray拆分为按字母顺序排列的部分,以便与索引tableview一起使用

时间:2011-09-18 20:57:46

标签: iphone ios uitableview

我有一个NSArray,我已经从我从数据库获取的一些xml按字母顺序解析和排序。我现在想知道如何拆分这个数组以便与tableview上的索引一起使用,以便更快地进行搜索。

我的表格有点不同之处在于它不会总是使用整个字母表,而且与大多数示例不同,我发现我使用的数据集每天都有很多不同......

所以我试图弄清楚如何将排序后的数组拆分成并不总是相同的字母部分。

正如cocofu指出的那样,是的,我已经实现了sectionIndexTitlesForTableView,我现在正在尝试将我的nsarray拆分为多个部分,以便滚动与sectionIndexTitlesForTableView一起使用。

3 个答案:

答案 0 :(得分:6)

我将使用您在数组中使用的第一个字母创建一个NSSet,然后从中创建一个排序数组。假设所有首字母都是正确的情况,它看起来像:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
{
   NSMutableSet *mySet = [[[NSMutableSet alloc] init] autorelease];
   for ( NSString *s in myArray )
   {
     if ( s.length > 0 )
       [mySet addObject:[s substringToIndex:1]];
   }

   NSArray *indexArray = [[mySet allObjects] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
   return indexArray;
}

答案 1 :(得分:3)

您可以使用NSPredicate来导出数据:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 'a'"];
NSArray *aElements = [myArray filterUsingPredicate:predicate];

我希望听到一种更有效的方式,而不是循环或为Alphabet的每个字母运行26个NSPredicate语句,或者使用字符循环并返回元素。

您可以将每个已过滤的数组存储在NSDictionary中,并将字母表中的所有字母作为键,然后稍后检索它并检查它是否为空(这意味着它没有该字母的元素)。我相信BEGINSWITH是区分大小写的

答案 2 :(得分:-1)

“arr”这里包含从数据库或解析xml或其他内容后获取的所有结果。

按升序排序数组(我的代码中为arrSortedResults)。

    - (void)viewDidLoad
    {
        [super viewDidLoad];   
        NSMutableArray *arr=[[NSMutableArray alloc]initWithObjects:@"a",@"b",@"c",@"c",@"a1",@"b1",@"c1",@"a2",@"a3",@"a4",@"b", nil];

                tableGroupView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStyleGrouped];//simply initialization of tableview
                tableGroupView.delegate=self;
                tableGroupView.dataSource=self;
                [self.view addSubview:tableGroupView];

                NSArray *arrSortedResults= [arr sortedArrayUsingSelector:@selector(compare:)];

        ArrayForArrays=[[NSMutableArray alloc]init];//initialize a array to hold arrays for section of table view

                BOOL checkValueAtIndex=NO;  //flag to check
                SectionHeadsKeys=[[NSMutableArray alloc]initWithObjects:nil];//initialize a array to hold keys like A,B,C ...

                for(int index=0;index<[arrSortedResults count];index++)
                {
                    NSMutableString *strchar=[arrSortedResults objectAtIndex:index];
                    NSString *sr=[strchar substringToIndex:1];
                    NSLog(@"%@",sr);//sr containing here the first character of each string
                 if(![SectionHeadsKeys containsObject:[sr uppercaseString]])//here I'm checking whether the character already in the selection header keys or not
                        {
                            [SectionHeadsKeys addObject:[sr uppercaseString]];
                            TempArrForGrouping=[[NSMutableArray alloc]initWithObjects:nil];
                            checkValueAtIndex=NO;
                        }
                    if([SectionHeadsKeys containsObject:[sr uppercaseString]])
                    {
                        [TempArrForGrouping addObject:[arrSortedResults objectAtIndex:index]];
                        if(checkValueAtIndex==NO)
                        {
                            [ArrayForArrays addObject:TempArrForGrouping];
                            checkValueAtIndex=YES;
                        }
                    }
                }

      }  
        //after this ArrayForArrays will contain all the arrays which will become groups under the header headerkeys

            - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
                return [ArrayForArrays count];
            }

            - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
            {
                return [SectionHeadsKeys objectAtIndex:section];
            }

            - (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
            {
                NSArray *arr=  [ArrayForArrays objectAtIndex:section];

                return [arr count];


            }

            - (UITableViewCell *)tableView:(UITableView *)tableView
                     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
                static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
                UITableViewCell * cell = [tableView
                                          dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
                if(cell == nil) {
                    cell =[[UITableViewCell alloc]
                           initWithStyle:UITableViewCellStyleDefault
                           reuseIdentifier:SimpleTableIdentifier];
                }
                int section=[indexPath section];
                NSArray *arr=[ArrayForArrays objectAtIndex:section];
                cell.textLabel.text=[arr objectAtIndex:indexPath.row];
                return cell;
            }

            now output will be as bellow:

            ![enter image description here][1]



      [1]: http://i.stack.imgur.com/tcPr6.png