【问题标题】:NSortDescriptor printing out and sorting incorrectlyNSortDescriptor 打印输出和排序不正确
【发布时间】:2014-09-04 18:39:54
【问题描述】:

好的,我将我的问题分解为一个更简单、更具体的问题来理解。所以下面的代码有一个数字序列:1,0,1,0 但是当我在它排序后打印出来时,它打印出:0,0,0,0。我在这里做错了什么?

 SortedDetailFields * sorty = [[SortedDetailFields alloc]init];

NSMutableArray * fieldArray = [[NSMutableArray alloc]init];

BOOL fieldone, fieldtwo,fieldthree,fieldfour;

NSSortDescriptor *fff = [NSSortDescriptor sortDescriptorWithKey:@"numbersToSort"
                                                                    ascending:NO];
fieldone = true;

fieldtwo = false;

fieldthree = true;

fieldfour = false;



if (fieldone) {
    sorty.numbersToSort = @"1";
    [fieldArray addObject:sorty];

}else{
    sorty.numbersToSort = @"0";
    [fieldArray addObject:sorty];
}

if (fieldtwo) {
   sorty.numbersToSort = @"1";
    [fieldArray addObject:sorty];
}else{
    sorty.numbersToSort = @"0";
    [fieldArray addObject:sorty];
}
if (fieldthree) {
    sorty.numbersToSort = @"1";
    [fieldArray addObject:sorty];
}else{
    sorty.numbersToSort = @"0";
    [fieldArray addObject:sorty];
}
if (fieldfour) {
    sorty.numbersToSort = @"1";
    [fieldArray addObject:sorty];
}else{
    sorty.numbersToSort = @"0";
    [fieldArray addObject:sorty];
}




NSLog(@"By numbers : %@",[fieldArray sortedArrayUsingDescriptors:@[fff]]);

for (SortedDetailFields * detain in fieldArray) {
    NSLog(@"Number %@",detain.numbersToSort);
}

所以我的问题是如何对对象进行排序和打印,以使它们与序列 1、1、0、0 匹配? 任何帮助是极大的赞赏。谢谢!

【问题讨论】:

  • 您正在修改同一个对象sorty 并添加到数组中,最后设置的值为零,因为 fieldFour 为 false。尝试打印您的数组,您将多次添加相同的对象
  • 这里有一点教训:当您说数据“排序不正确”时,您完全错过了数据一开始就错误的可能性更大的情况。调试时,草率下结论通常是不明智的 - 始终验证过程的每个步骤。
  • Hot licks 我完全是为了提高我的问题的准确性,但我更关心从我的错误中吸取教训。
  • 我的意思是您错误地假设症状 == 原因。你需要从那个的错误中吸取教训。,
  • 我支持你。

标签: ios objective-c arrays sorting


【解决方案1】:

基于@Naveen Prasad R 的评论:

最简单的解决方案是创建 NSDictionaries,每次都是一个新的:

NSMutableArray* fieldArray = [NSMutableArray new];

[fieldArray addObject:@{@"field":@"fieldOne",@"value":"@(fieldone)}];
[fieldArray addObject:@{@"field":@"fieldTwo",@"value":"@(fieldtwo)}];
[fieldArray addObject:@{@"field":@"fieldThree",@"value":"@(fieldthree)}];
[fieldArray addObject:@{@"field":@"fieldFour",@"value":"@(fieldfour)}];

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"value"
                                                                    ascending:NO];

NSArray* sortedArray = [fieldArray sortedArrayUsingDescriptors:@[sorter]];
for (NSDictionary* dict in sortedArray) {
    NSLog(@"Number %@",dict[@"value"]);
}

这应该可以。还请确保如果您使用'sortedArrayUsingDescriptors',您的原始数组不会改变,但会返回排序后的版本! (在我的例子中'sortedArray')

而不是字符串 'fieldOne', 'fieldTwo' ...你应该只使用你的真实对象!

【讨论】:

  • 那么在值的内部,我可以添加任何数据类型吗?那么我可以在 value 参数中添加我的 sorty 对象吗?
  • 哈! nvm 你的帖子清楚地说我应该可以。你能说我一直在摔跤吗?
  • 当我将我的对象放在字符串 fieldOne 中时,我收到一个错误“Illegal type SortedDetailFields used in boxed expression。”
  • @{@"field":sorty,@"value":"@(fieldone)} 这不起作用?(我不确定您要放入哪个对象)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多