用另一个数组排序数组

时间:2017-08-20 03:11:27

标签: ios objective-c

我有以下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];

4 个答案:

答案 0 :(得分:1)

您需要先将categoryNames数组转换为dictionary,并使用NSString键和NSNumber int值,该值将是数组中的顺序< / p>

//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顺序排列对象数组

希望这有帮助

答案 1 :(得分:1)

另一种方法可能是没有使用sortedArrayUsingComparator,使用两个for循环。
声明一个名为sortedCategoryElements的新Mutable数组并比较categoryNames中的categoryTempElements ,如果匹配将其添加到新数组sortedCategoryElements

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

我尝试了一组数据,它对我有用。
希望它有所帮助!

答案 2 :(得分:0)

创建一个字典,其中cName作为键,Category对象作为值。然后遍历categoryNames数组,并使用categoryNames中的每个项作为键来构建另一个数组。生成的数组应按categoryNames的顺序排序。

答案 3 :(得分:0)

NSArray有一个方法sortedArrayUsingComparator:,它使用您传递的块实现的排序对数组进行排序。这个类型NSComparator的块被传递给数组的两个元素,你必须返回这两个元素的顺序。

  

现在,我有categoryTempElements并且它有cName属性。

因此,您的广告块将被传递两个categoryTempElements,您需要访问每个广告的cName属性,并比较生成的两个值......

  

我需要知道如何以categoryTempElements

的顺序订购categoryNames

categoryNames数组中的那些值的位置,即索引。方法indexOfObject:为您提供该索引。

所以把它放在一起,你的问题就解决了。

HTH