Как разбить NSArray на алфавитные секции для использования с индексом табличного представления - PullRequest
4 голосов
/ 19 сентября 2011

У меня есть NSArray, который я проанализировал и отсортировал по алфавиту из некоторого xml, который я получаю из своей базы данных. Теперь мне интересно, как разделить этот массив для использования с индексом в виде таблицы для более быстрого поиска.

Моя таблица немного отличается: она не всегда использует весь алфавит, и, в отличие от большинства примеров, я обнаружил, что набор данных, который я использую, меняется день ото дня ..

поэтому я пытаюсь выяснить, как разбить отсортированный массив на алфавитные секции, которые не всегда одинаковы.

Как указал Cocofu, да, у меня уже реализован мой sectionIndexTitlesForTableView, сейчас я пытаюсь разбить свой nsarray на разделы, чтобы прокрутка работала с sectionIndexTitlesForTableView.

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Я бы создал 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;
}
3 голосов
/ 19 сентября 2011

Вы можете использовать NSPredicate для получения данных следующим образом:

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

Я хотел бы услышать о более эффективном способе, чем зацикливание или запуск 26 операторов NSPredicate для каждой буквы алфавитаили делать цикл с символами и возвращать элементы.

Вы можете сохранить каждый отфильтрованный массив в NSDictionary со всеми буквами алфавита в качестве ключей, а затем получить его позже и проверить, не является ли он пустым (что означает, что у него нет элементов для этой буквы).Я считаю, что BEGINSWITH чувствителен к регистру

0 голосов
/ 06 ноября 2012

«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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...