2017-08-20 250 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; 
     } 
    } 
} 

我试着用你的一组数据,它为我工作。
希望它有帮助!