2017-08-20 291 views
1

我有以下categoryNames陣列。與另一個陣列排列陣列

enter image description here

而現在,我有categoryTempElements,它有cName財產。我需要知道如何訂購categoryTempElements,訂單爲categoryNames

enter image description here

更新:我已經加入sortOrder屬性Category對象,並嘗試了以下,但爲了不發生變化。

for (Category* a in categoryTempElements) { 
     int index = (int)[categoryNames indexOfObject:a.cName]; 
     a.sortOrder = index; 
} 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray = [categoryTempElements sortedArrayUsingDescriptors:sortDescriptors]; 
+0

我需要解決方案在目標c – hotspring

回答

1

你需要先轉換你的categoryNames數組dictionaryNSString鍵和NSNumberint值,該值將在數組中

//this is example code, this will be your first array (reference value array) 
NSArray * array = @[@"prueba",@"prueba2",@"prueba3"]; 
//first you need convert this array in NSDictionary 

NSMutableDictionary * arrayDict = [NSMutableDictionary dictionary]; 
int counter = 0; 
for (NSString * value in array) { 
    if(arrayDict[value] == nil) 
    { 
     arrayDict[value] = [NSNumber numberWithInt:counter]; 
    } 
    counter++; 
} 

在此之後,爲了那麼你就可以得到價值並用sortedArrayUsingComparator方法訂購,類似這樣的

//this is an example of your second array categoryTempElements 
NSArray * arrayOfObjs = @[[testObject testObjectWithName:@"prueba3"],[testObject testObjectWithName:@"prueba"],[testObject testObjectWithName:@"prueba2"]]; 

    NSArray * sorted = [arrayOfObjs sortedArrayUsingComparator:^NSComparisonResult(testObject * _Nonnull obj1, testObject * _Nonnull obj2) { 
     if([((NSNumber*)arrayDict[obj1.cName]) intValue] < [((NSNumber*)arrayDict[obj2.cName]) intValue]){ 
      return NSOrderedAscending; 
     } 

     if([((NSNumber*)arrayDict[obj1.cName]) intValue] > [((NSNumber*)arrayDict[obj2.cName]) intValue]){ 
      return NSOrderedDescending; 
     } 

     return NSOrderedSame; 
    }]; 


    for (testObject * obj in sorted) { 
     NSLog(@"%@",obj.cName); 
    } 

瞧在sorted你將擁有你的第一陣列NSString爲了

希望這有助於

+0

任何想法https://stackoverflow.com/questions/45808703/order-an-array-based-on-one-property – hotspring

0

創建一個cName作爲鍵和Category對象作爲值的字典。然後遍歷categoryNames數組,並使用categoryNames中的每個項目作爲關鍵字來構建另一個數組。結果數組應該按照與categoryNames相同的順序排序。

+0

你能請說明與代碼? – hotspring

0

NSArray有一個方法sortedArrayUsingComparator:它使用您傳遞的塊執行的順序對數組排序。這個NSComparator類型的塊被傳遞給你的數組中的兩個元素,你必須返回這兩個元素的順序。

而現在,我有categoryTempElements它具有cName屬性。

所以你的塊被傳給兩個categoryTempElements,你需要逐一接入各家的cName財產,然後比較所產生的兩個值...

我需要知道如何與訂貨categoryTempElementscategoryNames

由位置,即以便在categoryNames陣列索引,這些值的。方法indexOfObject:爲您提供了該索引。

所以把它放在一起,你的問題就解決了。

HTH

+0

我已經用您提出的方法更新了我的問題,但我得到的訂單相同,訂購沒有更改。 – hotspring

+0

這個答案不建議你添加任何屬性,或者使用排序描述符 - 這兩個都不是必需的 - 這就是你當前的編輯顯示的內容。閱讀我提到的方法和類型的文檔,閱讀答案中的步驟,然後在幾行代碼中找到解決方案。如果卡住了,你可以編輯你的問題,或者詢問一個新問題,說明你做了什麼,並解釋什麼不起作用。 HTH – CRD

1

另一種方式可能是分類對象的數組,而無需使用sortedArrayUsingComparator,使用兩個for循環。
聲明稱爲sortedCategoryElements可變的新陣列,並比較在categoryTempElementscategoryNames,如果匹配將其添加到新陣列sortedCategoryElements

NSMutableArray *sortedCategoryElements = [NSMutableArray new]; 
for (NSString *name in categoryNames) { 
    for (Category *category in categoryTempElements) { 
     if (name == category.cName) { 
      [sortedCategoryElements addObject:category]; 
      break; 
     } 
    } 
} 

我試着用你的一組數據,它爲我工作。
希望它有幫助!