繁体   English   中英

使用NSPredicate对NSArray进行排序,然后存储在新数组中

[英]Sort NSArray with NSPredicate then store in a new array

我有一个UITableView通过数组( tableArray )填充,该数组是从核心数据填充的。

每个UITableViewCell在创建时都会分配一个数字,并且数字存储在数组中。 numberArray

当用户对行重新排序时,数字将在数组中移动(当然与tableView一起使用)

因此,这里使用了两个可变数组。

numberArray保存TableViewCells的数字(或顺序)。 我需要对保存UITableViewCell的文本( tableArray )的数组进行排序,以反映numberArray持有的顺序。

同样,这很重要:正如我之前所说,每个单元格都分配有一个数字,该数字存储在numberArray

我需要对两个数组进行排序,以将相同的值保存在同一位置。

因此,例如:

tableArray一些对象:

1) hi
2) whats Up
3) this
4) is cool!

因此您可以看到这里的每个对象都分配了一个数字1-4。 并将每个数字添加到numberArray

用户可以移动单元格,因此显然数字的顺序将改变。

所以当视图加载时,我需要获取numberArray的确切顺序,无论它是

1,2,3,4 or 2,4,3,1

我需要排序的tableArray反映相同的顺序numberArray所以当视图加载时,如果numberArray's顺序是2,3,4,1我想tableArray's顺序设置为

2“ whats up”,3“ this”,4“很酷!”,1“ hi”。

我相信我可以通过NSPredicate做到这NSPredicate

任何帮助是极大的赞赏!

编辑

cellForRow:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * identifier = @"identifier";

self.myCell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (self.myCell == nil) {
    self.myCell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

HandgunAmmo *handgunAmmo = [self.tableArray objectAtIndex:indexPath.row];
self.myCell.brandLabel.text = handgunAmmo.brand;
self.myCell.caliberLabel.text = handgunAmmo.caliber;
self.myCell.numberOfRoundsLabel.text = handgunAmmo.numberOfRounds;
return self.myCell;
}

在我的viewWIllAppear方法中:

- (无效)viewWillAppear中:(BOOL)动画{

if (self.context == nil)
{
    self.context = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"HandgunAmmo" inManagedObjectContext:self.context];
[request setEntity:entity];
NSError *error;
NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];
    [self setTableArray:array];

[self.ammoTable reloadData];
[super viewWillAppear:YES];
}

因此,更改数组时不能保持持久性的原因是因为我正在从核心数据中加载数据,并且我调用了[self setTableArray:array]; 它将所有数据从核心数据重新加载到数组中,然后使用数组填充tableview。 所以我需要能够对array进行排序,然后再将其设置为self.tableArray

感谢您的帮助!

为什么不保留tableArray不变,而将numberArray用作另一个数组的索引

您可以使用以下方式将numberArray初始化为numberArray 0, 1, 2, ..., n-1

numberArray = [NSMutableArray array];
for (NSUInteger i = 0; i < [tableArray count]; i++) {
     [numberArray addObject:[NSNumber numberWithUnsignedInteger:i]];
}

当需要一个项目时,例如在cellForRowAtIndexPath ,可以通过索引访问它:

NSUInteger i = [[numberArray objectAtIndex:row] unsignedIntegerValue];
NSString *item = [tableArray objectAtIndex:i];

现在,您只需要对numberArray进行重新排序,更改将自动反映在表视图中。

更新:在这里可以找到一种很好的解决方案来处理表视图中的核心数据对象的重新排序: UITableView核心数据重新排序

NSMutableArray *unsortedArray = [NSMutableArray arrayWithObjects:@"1) hi",@"2) whats Up",@"3) this",@"4) is cool!",nil];
NSArray *guideArray = [NSArray arrayWithObjects:@"2",@"4",@"3",@"1", nil];

for(int i=0; i< [guideArray count];i++)
{
    for(int j=0; j< [unsortedArray count];j++)
    {
        if([[[unsortedArray objectAtIndex:j] substringToIndex:[[guideArray objectAtIndex:i] length]] isEqualToString:[guideArray objectAtIndex:i]])
        //if([[unsortedArray objectAtIndex:j] containsObject:[guideArray objectAtIndex:i]])
        {
            [unsortedArray exchangeObjectAtIndex:j withObjectAtIndex:i];
            break;                
        }
    }
}

NSLog(@"%@",unsortedArray);

要么

guideArray = @[@"2",@"4",@"3",@"1"];
unsortedArray = [@[@[@"1) hi"],
                   @[@"2) wats up "],
                   @[@"3) this,"],
                   @[@"4) cool"]] mutableCopy];

[unsortedArray sortUsingComparator:^(id o1, id o2) {
    NSString *s1 = [o1 objectAtIndex:0];
    s1 = [s1 substringToIndex:[s1 rangeOfString:@")"].location];
    NSString *s2 = [o2 objectAtIndex:0];
    s2 = [s2 substringToIndex:[s2 rangeOfString:@")"].location];
    NSInteger idx1 = [guideArray indexOfObject:s1];
    NSInteger idx2 = [guideArray indexOfObject:s2];
    return idx1 - idx2;
}];
NSLog(@"%@",unsortedArray);

尝试此希望部分帮助。

我看不到用谓词解决问题的方法

NSArray *stringArray = @[@"hi", @"what's up?", @"this", @"is cool"];
NSArray *numberArray = @[@2, @4, @3, @1];
NSMutableArray *combinedArray = [NSMutableArray array];

//connect string with the numbers of there new position
[numberArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *string =stringArray[[obj integerValue]-1];
    [combinedArray addObject:@[string, obj]];
}];


NSMutableArray *orderedArray = [NSMutableArray array];
[combinedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [orderedArray addObject:obj[0]];
}];

NSLog(@"%@", orderedArray);

结果

(
    "what's up?",
    "is cool",
    this,
    hi  
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM