Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 按升序对一系列数字排序,但在末尾发送零_Ios_Objective C_Nsarray_Nssortdescriptor - Fatal编程技术网

Ios 按升序对一系列数字排序,但在末尾发送零

Ios 按升序对一系列数字排序,但在末尾发送零,ios,objective-c,nsarray,nssortdescriptor,Ios,Objective C,Nsarray,Nssortdescriptor,我有一个简单的NSArray,包含NSNumbers 我按升序对数组进行排序,如下所示: NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]; [_scores sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]]; 我的问题是,我希望包含0的NSNumbers位于末尾而不是开

我有一个简单的
NSArray
,包含
NSNumber
s

我按升序对数组进行排序,如下所示:

NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[_scores sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];
我的问题是,我希望包含
0
NSNumber
s位于末尾而不是开头。以下是我可能需要排序的数组类型(仅作为示例,其中包含一些空的
NSNumber
s):

我的代码当然会对数组进行如下排序:

0
0
0
8
12
25
我想要的是:

8
12
25
0
0
0

当然,我可以通过删除带有
0
的行并在末尾添加它们来手动重新排序,但我正在寻找最干净的解决方案。

方法1:

  • 步骤1:对数组进行排序

  • 步骤2:将零移动到数组的末尾

方法2:

  • 步骤1:编写一个比较器函数,在任何其他值之后排序
    0

  • 步骤2:对数组进行排序


    • 这将解决您的问题

      NSArray *sortedScores = [_scores sortedArrayUsiHelperComparator:^(id obj1, id obj2){
          if([obj1 integerValue]==0 && [obj2 integerValue]==0){
              return (NSComparisonResult) NSOrderedSame;
          }else if([obj1 integerValue]==0){
              return (NSComparisonResult) NSOrderedDescending;
          }else if([obj2 integerValue]==0){
              return (NSComparisonResult) NSOrderedAscending;
          }
          if([obj1 integerValue] >[obj2 integerValue]) return (NSComparisonResult) NSOrderedDescending;
          if([obj1 integerValue] <[obj2 integerValue]) return (NSComparisonResult) NSOrderedAscending;
          return (NSComparisonResult) NSOrderedSame;
      
      }];
      
      NSArray*sortedScores=[\u分数SortedArrayusHelperComparator:^(id obj1,id obj2){
      如果([obj1整型值]==0&&[obj2整型值]==0){
      返回(NSComparisonResult)命令名;
      }否则如果([obj1 integerValue]==0){
      返回(NSComparisonResult)或撤销;
      }else if([obj2 integerValue]==0){
      返回(NSComparisonResult)或删除;
      }
      if([obj1 integerValue]>[obj2 integerValue])返回(NSComparisonResult)取消降级;
      if([obj1 integerValue]使用

      NSArray*sortedArray=[使用比较器的数组sortedArray:^(id obj1,id obj2){
      如果([obj1整型值]==0&&[obj2整型值]==0)
      {
      返回(NSComparisonResult)命令名;
      }
      如果([obj1 integerValue]==0)
      {
      返回(NSComparisonResult)或撤销;
      }
      if([obj2 integerValue]==0)
      {
      返回(NSComparisonResult)或删除;
      }
      如果([obj1整型值]>[obj2整型值])
      {
      返回(NSComparisonResult)或撤销;
      }
      如果([obj1整型值]<[obj2整型值])
      {
      返回(NSComparisonResult)或删除;
      }
      返回(NSComparisonResult)命令名;
      }];
      
      您可以使用
      NSPredicate
      筛选不需要的值

      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 0"];
      NSMutableArray *filteredArray = [[_scores filteredArrayUsingPredicate:predicate] mutableCopy];
      NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
      [filteredArray sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];
      

      @JeremyP的回答提供了适当的排序,这可能就是您想要的

      但是,为了完整性起见,可以使用过滤器和标准的
      compare:
      方法:

      NSArray *numbers = @[@12, @0, @10, @15, @0, @3];
      
      NSArray *sortedPositiveNumbers = [[numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self > 0"]] sortedArrayUsingSelector:@selector(compare:)];
      NSArray *zeroes = [numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self = 0"]];
      
      NSArray *result = [sortedPositiveNumbers arrayByAddingObjectsFromArray:zeroes];
      

      多亏了Caleb的火花。

      8、12、0的升序和降序是怎样的?你是如何将
      nil
      存储在
      NSArray
      中的?或者你确定你有
      NSNumber
      实例吗?它们不是
      NSString
      s吗?@H2CO3同意作者如何将nil值存储在repres中NSArrayIt的升序中NSNumber的entation,值0除外,该值在数组末尾发送。它们实际上不是“nil”对象,而是未初始化的NSNumber。在调试控制台中显示为[5]id 0x00000000我从帖子中删除了它们,因为这确实很奇怪。对此很抱歉。@rdurand
      0x00000000
      NULL
      指针->它们实际上是
      nil
      。你是如何将它们放入数组的?这是某种
      CFArray
      桥接吗?谢谢,但这不是我在寻找的,正如我在问题中所说的。@monolo:当我发表我的评论时,Caleb只提出了第一种方法。我在问题中说,我知道我可以做到这一点,但我在寻找比“排序然后移动零”更干净的方法方法2正是JeremyP在其答案中所说的,该答案在Caleb编辑自己的答案之前公布。谢谢,但我认为JeremyP的答案在比较[id1 integerValue]时更准确==0而不是obj1==nil。在我的例子中,我希望零位于末尾,而不是nil对象。在你的问题中,有nil值。我为此编写了代码。你已经更改了问题。现在检查!无论如何,你不能将
      nil
      s放在
      NSArray
      中。@JeremyP,这是添加空值的方法:[[u scores addObject:[NSNull null]];@ThilinaHewagama是的,但是
      [NSNull-null]
      不是
      nil
      [NSNull-null]是一个表示集合中的空值的对象,不能包含零。一个占位符,如果你愿意的话。看起来就像我正在寻找的一样。谢谢!我曾想过使用比较器,但无法使其工作。@Gokhancokkeci你是说id1和id2-这显然是一个错误,现在已经修复。谢谢,但我相信这会删除所有的零,对吗?我希望将它们保留在数组中,但最后会保留。无论如何,谢谢,这可能会在将来对我有好处。@r是的,代码会删除1行中所有小于0的值。然后它会根据您想要的顺序进行排序。
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 0"];
      NSMutableArray *filteredArray = [[_scores filteredArrayUsingPredicate:predicate] mutableCopy];
      NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
      [filteredArray sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];
      
      NSArray *numbers = @[@12, @0, @10, @15, @0, @3];
      
      NSArray *sortedPositiveNumbers = [[numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self > 0"]] sortedArrayUsingSelector:@selector(compare:)];
      NSArray *zeroes = [numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self = 0"]];
      
      NSArray *result = [sortedPositiveNumbers arrayByAddingObjectsFromArray:zeroes];