我如何sorting一个NSMutablearrays与NSNumbers呢?
我试图做一个高分表,并在目标c(实际上,总的来说目标c是挑战我)吸arrays,所以我不知道如何sorting。 我试图做这样的事情(speudocode,我正在写这个动作的风格,因为我更舒服):
highscores.addObjecttoArray(score) highscores.sort(ascending)
但我无法弄清楚…我已经看到了其他线程,但他们使用plist文件和东西,我不知道足够的目标C向他们学习。
你想做那个简短的方法吗?
如果你有一个可变的NSNumber
实例数组:
NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; [mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];
好,易于 :)
您也可以使用不可变数组上的描述符执行类似的sorting,但是最终会得到一个副本,而不是就地sorting。
[highscores sortUsingSelector:@selector(compare:)];
应该工作,如果他们绝对是所有的NSNumber
s。
(添加一个对象是:
[highscores addObject:score];
)
如果你想sorting(最高优先):
10.6 / iOS 4:
[highscores sortUsingComparator:^(id obj1, id obj2) { if (obj1 > obj2) return NSOrderedAscending; else if (obj1 < obj2) return NSOrderedDescending; return NSOrderedSame; }];
否则,您可以定义一个类别方法,例如:
@interface NSNumber (CustomSorting) - (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber; @end @implementation NSMutableArray (CustomSorting) - (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber { return [otherNumber compare:self]; } @end
并称之为:
[highscores sortUsingSelector:@selector(reverseCompare:)];
我尝试了由ohhorob提供的答案,但对象仍然按字母顺序sorting。 然后我碰到另一个答案( https://stackoverflow.com/a/4550451/823356 ):
我改变了我的NSSortDescriptor,它现在sorting数字。
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }];
我只是以为我会把它放在这里,因为它解决了我的'字母sorting的NSNumbers'问题
距离是一个关键,它的价值链接(浮动或双)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; NSArray *myArray = [NSArray arrayWithArray:arraySubCat]; myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]]; arraySubCat = [myArray copy];
所有这一切都值得,这里是另一个速记方法:
NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5]; NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { return [n1 compare:n2]; }]; NSLog(@"Ascending: %@", asc); NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { return [n2 compare:n1]; }]; NSLog(@"Descending: %@", dec);
此代码将按升序对NSNumber的NSMutableArray进行sorting:
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2]; }];
这段代码将按降序对NSNumber的NSMutableArray进行sorting:
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2] * -1; // reverse the enum }];
代码使用这样一个事实,即NSNumber compare:方法返回范围从-1到1的NSComparisonResult。将比较结果乘以-1反转结果,从而反转sorting以降序排列。
降序 :
NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors: @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" ascending:NO]]];
对于升序
NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors: @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" ascending:YES]]];