我有以下categoryNames
数组。
现在,我有categoryTempElements
并且它有cName
属性。我需要知道如何以categoryTempElements
的顺序订购categoryNames
。
更新:我已将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 :(得分: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