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:将零移动到数组的末尾
- 步骤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我从帖子中删除了它们,因为这确实很奇怪。对此很抱歉。@rdurand0x00000000
是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];