【问题标题】:How Do I sort an NSMutable Array with NSNumbers in it?如何对包含 NSNumbers 的 NSMutable 数组进行排序?
【发布时间】:2010-07-08 16:22:50
【问题描述】:

我正在尝试制作一个高分表,并在目标 c 中吸吮数组(实际上,一般来说,目标 c 对我来说是具有挑战性的),所以我不知道如何排序。我正在尝试做这样的事情(伪代码,我用动作脚本风格写这个,因为我更喜欢它):

highscores.addObjecttoArray(score)
highscores.sort(ascending)

但我想不通...我看过其他线程,但他们使用 plist 文件和东西,我不知道足够的目标 c 来向他们学习。

【问题讨论】:

  • 您应该阅读 NSPredicate 和 Predicate Programming 主题。理解谓词使 Obj-c 中的很多事情变得更容易,但大多数初始培训资源都不会花时间这样做。
  • @TechZen,我想你的意思是 NSSortDescriptior?
  • 啊,是的。我的大脑大约有一半时间坚持转换 NSSortDescriptior 和 NSPredicate 。如果题外话,我的建议仍然是合理的。

标签: iphone objective-c arrays


【解决方案1】:

你想走捷径吗?

如果您有一个可变数组 NSNumber 实例:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];

又好又简单:)

您也可以使用不可变数组上的描述符执行类似的排序,但最终会得到一个副本,而不是就地排序。

【讨论】:

  • 又好又容易的宝贝 ;)
  • 澄清(和优化):NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; NSArray * sortedArray = [mutArray sortedArrayUsingDescriptors:@[highestToLowest]];
  • 排序描述符通常用于需要排序的对象实例。您将键指定为用于排序的对象的属性。如果是说“人”类的实例,您可以使用"firstName" 的键。在这种情况下,NSNumber 对象没有要指定为键的属性,因此使用特殊属性 "self" 来引用数字本身的值!
【解决方案2】:

[highscores sortUsingSelector:@selector(compare:)];

如果他们肯定都是NSNumbers 应该可以工作。

(添加对象为:

[highscores addObject:score];

)

如果要降序排序(最高优先):

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:)];

【讨论】:

  • 好的,小问题,我认为这是错误的排序方式......他们无论如何都要切换它吗?
  • 你的意思是升序降序?
  • 您在问题中说升序,但我会用额外的信息对其进行编辑。 :)
  • 我总是把升序和降序搞混,谢谢你的帮助。
  • @Wevah,虽然使用类别或块很有教育意义,但有排序机制 (NSSortDescriptor) 用于像这种情况下的简单排序。
【解决方案3】:

我尝试了 ohhorob 提供的答案,但对象仍在按字母顺序排序。然后我在另一个答案(https://stackoverflow.com/a/4550451/823356)中遇到了这个问题:

我更改了我的 NSSortDescriptor,它现在按数字排序。

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score"
                                               ascending:YES
                                              comparator:^(id obj1, id obj2) {
    return [obj1 compare:obj2 options:NSNumericSearch];
}];

我只是想我会把它放在这里,因为它解决了我的“NSNumbers 的字母排序”问题

【讨论】:

    【解决方案4】:

    尽管如此,这里有另一种速记方法:

    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);
    

    【讨论】:

      【解决方案5】:

      此代码将按升序对 NSNumber 的 NSMutableArray 进行排序:

      [tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
          return [obj1 compare:obj2];
      }];
      

      此代码将按降序对 NSNumber 的 NSMutableArray 进行排序:

      [tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
          return [obj1 compare:obj2] * -1; // reverse the enum
      }];
      

      代码使用了 NSNumber compare: 方法返回一个范围从 -1 到 1 的 NSComparisonResult 的事实。将比较结果乘以 -1 会反转结果,从而将排序反转为降序。

      【讨论】:

      • 或者您可以将[obj1 compare:obj2] 更改为[n2 compare:n1]
      【解决方案6】:

      距离是一个键,它是值链接(浮点或双精度)

      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];
      

      【讨论】:

        【解决方案7】:

        降序

        NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                        @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                        ascending:NO]]];
        

        升序

        NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                        @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                        ascending:YES]]];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 2012-06-19
          相关资源
          最近更新 更多