2012-11-14 145 views
0

如何通過比較其中一個屬性(NSString *)與另一個(NSString *)數組中的對象(NSString *)來排序對象數組?按屬性排列對象數組等於另一個數組的對象

我填充了一個數組, Person對象中有多個線程完成的順序。然後,我想將每個Person.name與已經排序的名稱對象數組進行比較。結果將是Person數組按照與person.name屬性相同的順序排列。

+0

你有一個代碼示例,或至少有一些輸入的實例和預期產出? – Joe

+0

更新的問題謝謝。有沒有一個排序描述符,而不是寫一個自定義解決方案? – jarryd

回答

1

你可以嘗試一些與此類似,用很少的細節就是最好的我能想出:

NSArray *array1 = [NSArray array]; 
NSArray *sortedArray = [NSArray array]; 
NSMutableArray *tmpArray = [NSMutableArray array]; 

for (id object in sortedArray) 
{ 
    if ([array1 containsObject:object]) 
     [tmpArray addObject:object]; 
} 

此代碼迴路扔數組排序並檢查排序的數組包含了相同的對象。如果它確實放在tmpArray中。如果完成,它將包含它包含的項目的排序數組。

下面是我使用NSPredicate找到的一個鏈接,用於更優化的解決方案https://stackoverflow.com/a/2873439/507299

+0

謝謝,是的,我想到了這一點,但想知道是否有使用排序描述符的更優化的解決方案。 – jarryd

+0

有'NSPredicate'縮短代碼讓我看看我能否找到一個例子。 –

+0

感謝您的鏈接。 – jarryd

0

也許類似的東西

NSMutableArray *excluded = [NSMutableArray array]; 
NSArray *sortedNames = @[@"name1", @"name5", @"name3", /*more names*/ @"nameX"]; 
NSArray *tmp = [inputArray sortedArrayUsingComparator: ^(id p1, id p2) { 

    NSUInteger pos1 = [sortedNames indexOfObject:((Person *)p1).name]; 
    NSUInteger pos2 = [sortedNames indexOfObject:((Person *)p2).name]; 

    if (pos1 == NSNotFound && ![excluded containsObject:p1]) { 
     [excluded addObject:p1]; 
    } 
    if (pos2 == NSNotFound && ![excluded containsObject:p2]) { 
     [excluded addObject:p2]; 
    } 

    if (pos1 == pos2) return NSOrderedSame; 
    if (pos1 > pos2) return NSOrderedDescending; 
    return NSOrderedAscending; 
}]; 
NSArray *sortedArray = [tmp subarrayWithRange:NSMakeRange(0, [tmp count] - [excluded count])]; 
相關問題