【问题标题】:sort NSInteger using sortUsingComparator使用 sortUsingComparator 对 NSInteger 进行排序
【发布时间】:2012-08-14 00:02:36
【问题描述】:

我正在尝试对NSObjects 的数组进行排序(一个对象属于一个类)。对象类有几个变量,我想用这些变量对数组中的对象进行排序,我用来排序的变量是NSStringNSInteger 类型,我相信我正在排序NSStrings 但对于这个问题我希望能得到对NSInteger排序的帮助。

这是我用来对对象数组进行排序的方法,它接收对象的NSMutableArray

- (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray
{
    [unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
        NSInteger DoorID1 = d1.doorID;
        NSInteger DoorID2 = d2.doorID;
        NSComparisonResult result = [DoorID1 localizedCompare:DoorID2]; // Not sure how to sort these two integers
        if (result == NSOrderedSame) {
            NSString *handel1 = d1.handel;
            NSString *handel2 = d2.handel;
            result = [handel1 localizedCompare:handel2];
         }

我不知道如何比较 NSInteger,我已经读过我可以从自身中减去每个数字。如果数字为 0,则它们相等或 +1 / -1 等它们不相等。但不确定如果这是解决此问题的最佳方法。

任何帮助将不胜感激。

【问题讨论】:

    标签: objective-c ios cocoa-touch nsinteger


    【解决方案1】:
    [unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
        NSInteger doorID1 = d1.doorID;
        NSInteger doorID2 = d2.doorID;
        if (doorID1 < doorID2)
            return NSOrderedAscending;
        if (doorID1 > doorID2)
            return NSOrderedDescending;
        return [d1.handel localizedCompare: d2.handel];
    }];
    

    [aString localizedCompare:anotherString] 将返回 NSOrdered(Ascending|Descending|same),您可以只返回字符串大小写的结果。

    【讨论】:

    • 比如说,如果 NSOrderedSame 的话,我必须进入下一个 if 字符串的语句,那么我该怎么做呢?剂量返回也返回哪里?
    • 好的,谢谢你.. 我有点明白你在这里做了什么.. 但是我认为我的问题源于我试图根据几个不同的 if 变量进行排序,NSString 和 NSInteger 的混合,所以我想弄清楚你是如何根据更多的变量来编写解决方案的格式,而不仅仅是两个。
    • 只需使用嵌套的 if 语句即可。您不需要立即返回。
    • 好的.. 我目前正在根据每个人的帮助 atm 制定一个解决方案.. 所以很快就会回复。
    • @vikingosegundo 我认为您将 NSOrderedAscending 和 NSOrderedDescending 情况混淆了。我必须反转它们以获得 NSBinarySearchingInsertionIndex 案例的正确插入索引。
    【解决方案2】:

    NSInteger 不是对象。它只是一个整数(intlong)。因此,您可以准确地比较它们,就像比较两个 ints。

    经典的 C 比较函数允许您使用 x - y 技巧,但这在这里不合适,因为您将返回一个不适合 NSComparisonResult 枚举的整数。因此,您可能应该只做类似的事情

    if (DoorID1 == DoorID2) {
        // compare secondary attribute
        NSString *handel1 = d1.handel;
        NSString *handel2 = d2.handel;
        return [handel1 localizedCompare:handel2];
    }
    else if (DoorID1 < DoorID2) return NSOrderedAscending;
    else return NSOrderedDescending;
    

    顺便说一句,您的排序标准可以用NSSortDescriptor 来表示,这样可能更清楚。

    - (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray {
        NSSortDescriptor *primary = [NSSortDescriptor sortDescriptorWithKey:@"doorID" ascending:YES];
        NSSortDescriptor *secondary = [NSSortDescriptor sortDescriptorWithKey:@"handel" ascending:YES selector:@selector(localizedCompare:)];
        [unsortedArray sortUsingDescriptors:@[primary, secondary]];
    }
    

    【讨论】:

    • 如果发生 NSOrderedSame 我如何进入下一段代码? (即比较一个字符串)因为我不确定 return 从哪里返回......
    • @HurkNburkS:return 正在从区块返回。
    • 关于您的排序描述符,它的作用如何?它首先根据主要然后次要对数组进行排序吗?还要考虑 NSString 或 NSInteger 类型吗?
    • @HurkNburkS:是的,它按第一个排序描述符排序,只有在第一个返回 NSOrderedSame 时才会转到下一个。它还在内部使用-valueForKey:,它会自动将NSIntegers 包裹在支持-compare:NSNumbers 中。第一个排序描述符将隐式使用-compare:,第二个将显式使用-localizedCompare:
    【解决方案3】:

    另一种选择:

    NSComparisionResult res = [@(d1.doorID) compare:@(d2.doorID)];
    return res == NSOrderedSame ? [d1.handel localizedCompare: d2.handel] : res;
    

    【讨论】:

      【解决方案4】:
      [unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
          NSInteger doorID1 = d1.doorID;
          NSInteger doorID2 = d2.doorID;
          if (doorID1 > doorID2)
              return NSOrderedAscending;
          if (doorID1 < doorID2)
              return NSOrderedDescending;
          if (doorID1==doorID2) {
              NSString *s1=d1.someString;
              NSString *s2=d2.someString;
              return [s1 compare:s2];
          }
      }
      

      【讨论】:

      • 好的,我明白这里发生了什么.. 现在会给出这个.. :) 会让你知道我的进展情况:P
      • 请注意,最后一个 if 语句不是必需的,因为整数必须相等。事实上,这可能会导致警告或错误,正如编译器必须假设的那样,不会到达任何 return 语句——这是不可能的。
      • 你说得对,来晚了..只是想向 HurkNburkS 展示这一切是如何运作的,因为他无法理解最后的回报声明
      • @vikingosegundo 是的,对于这个例子,你是对的,但是这实际上是我需要的,因为我有几个其他变量我正在排序,而不仅仅是我的例子中的两个。所以如果我想继续检查更多变量,它实际上很有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多