2010-10-25 28 views
0

(嗯..長標題)將自定義對象的NSArray轉換爲按字母順序排列的具有索引的UITableView?

如果我開始了與自定義對象的一個​​NSArray(每個對象是人)這樣的:

{ 
    surname:Allen forename: Woody, 
    surname:Baxter forename: Stanley, 
    surname:Clay forename: Cassius 
} 

..等..

你可以看到該數組已經在姓氏順序中。如何使用數組來創建一個節頭一節AA的UITableView,BC等,以及上側的指標事情垂直運行

               A 
                   B 
                   C 

編輯

我想我是什麼問的是如何把我的對象數組成科陣,與姓氏的所有的第一個字母,和一個姓數組,它也許是一個嵌套的數組是這樣的:

{ 
    letter: a 
    { surname:Allen forename: Woody } 
    letter: b 
    { surname:Baxter forename: Stanley } 
    etc 
} 

其實,或許只是一個嵌套數組將會做。

回答

3

可能有這樣做的百萬方式:)這裏有一個可能的工作(我相信這是可以做到更漂亮,但因爲沒有人回答):

NSMutableDictionary *aIndexDictionary = [[NSMutableDictionary alloc] init]; 
NSMutableArray *currentArray; 
NSRange aRange = NSMakeRange(0, 1); 
NSString *firstLetter; 
for (Person *aPerson in personArray) { 
    firstLetter = [aPerson.surname substringWithRange:aRange]; 
    if ([aIndexDictionary objectForKey:firstLetter] == nil) { 
    currentArray = [NSMutableArray array]; 
    [aIndexDictionary setObject:currentArray forKey:firstLetter]; 
    } 
    [currentArray addObject:aPerson]; 
} 

未經測試...

+0

哇,那編輯完全沒用@ P.J.Radadiya。 – 2016-03-10 16:54:43

+0

不,您的結構在wrong.my編輯中是有用的...... !! – 2016-03-11 05:05:35

0

約瑟夫圖拉的答案有一些問題,它沒有經過檢驗,因爲他提到。下面是問題:

1)[aPerson.name substringWithRange:aRange]將崩潰,如果名稱爲nil或@「」;

2)如果firstLetter已經在鍵列表中,則當前數組不會被重置爲指向屬於firstLetter鍵的數組對象。因此,如果currentArray先前指向一個數組,其字典中的鍵爲'K',但當前的第一個字母'P'已經作爲鍵存在,則名稱(以該字母'P'開始)將被添加到以'k'開頭的名稱數組。那裏的大問題。

3)由於案例的不同,Jassie被添加到jassie的不同數組中(大寫和小寫'k'被區別對待)。

所以,作爲一個巨大的進步約瑟的答案,2爲臨界點號,這裏是未來的用戶提供更準確的實現:

-(NSDictionary*)indexArrayByName:(NSArray*)people 
{ 
    NSMutableDictionary *anIndexedDict = [[NSMutableDictionary alloc] init]; 
    NSMutableArray *currentArray = nil; 
    NSRange aRange = NSMakeRange(0, 1); 
    NSString *firstLetter; 

    for(Person *aPerson in people) 
    { 
     if(aPerson.name.length) 
      firstLetter = [[aPerson.name substringWithRange:aRange] uppercaseString]; 
     else 
      firstLetter = @"noName";//find own way to identify these 

     if(![anIndexedDict.allKeys containsObject:firstLetter]) 
     { 
      currentArray = [NSMutableArray array]; 
      anIndexedDict[firstLetter] = currentArray; 
     } 
     currentArray = anIndexedDict[firstLetter]; 
     [currentArray addObject:aPerson]; 
    }  
    return anIndexedDict; 
} 

其他方面的改進,可以添加例如去除導致空格等,但我只是覺得我會提到主要問題。我測試了約瑟夫對這些問​​題的回答,然後我確定他們被淘汰了:)。乾杯。

相關問題