2014-01-09 40 views
0

3天前,我問的問題如何在字符串對象的第二個字元素和排序排序上的NSDictionary比排序上的NSArray給出不同的結果

我得到解決here

但現在我還是堅持到新問題

考慮我有

的NSArray用 - >名稱和

的NSDictionary與相同 - >作爲價值和電子郵件ID爲重點

而且我的NSArray名(NSArray的)含有

"Test Teacher" 

    "Anonymous" 

    "Dok Teacher" 

和我的NSDictionary包含

"Dok Teacher" --"[email protected]" 

    "Anonymous" -- "[email protected]" 

    "Test Teacher" --"[email protected]" 

當我需要整理這些陣列和字典我使用上面鏈接給出的方法對它們進行排序

但尾部呃排序我的第二個字

"Anonymous" 

    "Test Teacher" 

    "Dok Teacher" 

的NSDictionary排序後得到如下

NSArray的數據的值的第二個字

"Anonymous" -- "[email protected]" 

    "Dok Teacher" --"[email protected]" 

    "Test Teacher" --"[email protected]" 

爲什麼那麼多克老師和測試分選後在使用相同的排序方法後,老師在字典和nsarray中的不同位置。

以及如何讓它們以相同的順序排列數組和字典。

用於排序的NSArray代碼:

我還試圖上名字兩個陣列和字典,然後分選:用於排序的NSDictionary

myArray = [teachersList keysSortedByValueUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     return [firstTeacher2ndWord compare:secondTeacher2ndWord]; 
    }]; 

    NSLog(@"After %@",myArray); 

EDIT

NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:[teachersNames sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     return [firstTeacher2ndWord compare:secondTeacher2ndWord]; 
    }]]; 

    NSLog(@"After %@",sortedArray); 

    teachersSrc=[NSMutableArray arrayWithArray:sortedArray]; 

代碼排序兩個姓氏,但它根本不工作,

+0

用適當的縮進編輯你的問題。 – Tirth

+0

代碼在哪裏? –

+0

爲什麼你要維護兩個不同的集合,數組和字典? – Retro

回答

1

既然你有這樣的:

NSArray *array = @[@"Test Teacher",@"Anonymous",@"Dok Teacher"]; 
NSDictionary *dictionary = @{@"[email protected]":@"Dok Teacher",@"[email protected]":@"Anonymous",@"[email protected]":@"Test Teacher"}; 


//sort the array first 
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; 
    NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; 


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same 
     //compare full text 
     firstTeacher2ndWord = (NSString *)obj1; 
     secondTeacher2ndWord = (NSString *)obj2; 
    } 

    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch]; 
}]; 

NSLog(@"Sorted Array %@",sortedArray); 

//sort the dictionary key using values 
    NSArray *sortedDictionaryKey =[dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; 
    NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; 


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same 
     //compare full text 
     firstTeacher2ndWord = (NSString *)obj1; 
     secondTeacher2ndWord = (NSString *)obj2; 
    } 


    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] 
}]; 

//get the values from the dictionary based on the sorted keys 
NSLog(@"Sorted Dictionary %@",[dictionary objectsForKeys:sortedDictionaryKey notFoundMarker:[NSNull null]]); 

會給你這樣的輸出:

//Sorted Array 
Sorted Array(
Anonymous, 
"Dok Teacher", 
"Test Teacher" 
) 

//Sorted Dictionary 
Sorted Dictionary(
    Anonymous, 
    "Dok Teacher", 
    "Test Teacher" 
) 
+0

您是否使用過第二個單詞(即DOK的情況下爲「Teacher」,測試)進行排序,如果是,您在哪裏獲得它?就像在我的情況objectAtIndex:2 – ViruMax

+0

@VirendraRavalji你的意思是你只按第二個字排序條目?如果他們是唯一一次你會比較整個單詞嗎?那是對的嗎? – Joshua

+0

亞部分正確,因爲我還沒有寫代碼考慮全名或全字符串 – ViruMax

0

首先字典(teachersList)的值數組是未排序的,您不知道如何排列元素。

第二個Dok TeacherTest Teacher在第二個單詞上是相同的,它們之間沒有順序,排序後它們的順序取決於排序方法(穩定或不穩定)和原始數組的順序。

如果值數組中的元素在teachersNames中的順序相同,則結果將相同。否則,訂單Dok TeacherTest Teacher未定義。

注:此處值數組是teachersList.allValues

+0

亞正確,但然後如何使它們以相同的順序,我也試着對名字排序陣列和字典,然後排序上兩個名字,但它不工作,如何解決這個問題? – ViruMax

+0

@VirendraRavalji如果你想要他們有相同的順序,你必須確保你用於排序的密鑰是唯一的。所以我認爲你應該對名字沒有姓氏或名字。 – KudoCC

+0

我想,但客戶的要求 – ViruMax

0

的問題在你的代碼是第二個名稱Teacher包含在兩個詞。所以,當你在數組中排序相同。它會按字母順序排列名稱。由於第二個名字對於兩個單詞是相同的。所以它不會反映在輸出中。但是如果你改變順序,那麼你可以看到預期的輸出。我已經實現的代碼如下排序的數組: -

當執行該代碼下面你會得到輸出: -

NSArray *[email protected][@"Test Teacher",@"Anonymous",@"Dok Teacher"]; 
NSArray *sortedArray=[array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2 options:NSCaseInsensitiveSearch]; 
}]; 
NSLog(@"%@",sortedArray); 

輸出: -

Anonymous, 
"Dok Teacher", 
"Test Teacher" 
+0

由我的排序優先級只是姓氏即教師在這情況下,我認爲你已經考慮了整個名稱 – ViruMax

+0

@virendra,我只排序你想在輸出陣列的名稱。 –

+0

你有沒有看過我的完整問題,我會得到這樣的輸出,如果我排序的名字(第一個詞,即Dok,在這種情況下測試),但是當我排序他們的第二個名字(即在這種情況下,老師)沒有得到這個訂單。看我的代碼三是「objectAtIndex:2」 – ViruMax