【问题标题】:NSSortDescriptor custom alphanumeric orderNSSortDescriptor 自定义字母数字顺序
【发布时间】:2012-03-30 16:36:16
【问题描述】:

我正在尝试使用自定义的字母顺序对 NSArray 进行排序。交易是我有一个包含对象状态的字符串数组。

可用状态为entered, process, ready, done

现在,当我正常对它们进行排序(按字母顺序)时,顺序会不正确(完成、输入、处理、准备好)。

我尝试了以下代码以正确的方式对其进行排序:

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES comparator:^(id obj1, id obj2) {
    if ([obj1 isEqualToString:@"entered"] && [obj2 isEqualToString:@"process"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"entered"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"ready"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"process"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"done"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([obj1 isEqualToString:@"done"] && [obj2 isEqualToString:@"ready"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else {
        return (NSComparisonResult) NSOrderedSame;
    }
}];

我也尝试只使用单词的第一个字母,但也没有用。

当我使用这个比较器时,它只是不订购。数组保持“旧”顺序。

我吃错了什么?我不是理解排序比较器吗?

感谢您的帮助,亲切的问候,朱利安

【问题讨论】:

    标签: nsmutablearray nsarray sql-order-by comparator nssortdescriptor


    【解决方案1】:

    我认为您的字符串方案不适合您尝试做的事情。要记录状态,最好使用不同的数据模型并在视图中处理适当的字符串。

    一个常见的实现涉及一个enum,如果你这样定义它会自动递增:

    typedef enum {
       entered = 0,
       processed,
       ready,
       done
     } State;
    

    现在排序变得微不足道。

    您的state 应该是State 类型,它实际上是一个整数。如果要使用 NSDictionary 或 NSArray,则需要将其包装在 NSNumber 中,但如果使用 @property 类型为 State 的自定义对象,它肯定更具可读性。

    【讨论】:

    • 嘿蒙迪!很好的方法,谢谢!但是现在:如何将 NSString(带有状态名称)转换为 state 类型的对象?我无法更改数据库的表示,因为我的应用程序“只是”基于 Web 的应用程序的 iOS 包装器。 谢谢
    • 与处理其他 JSON 或 XML“字段”的方式相同。将它们与您的自定义对象的属性一一匹配。在这种情况下,也许只需要一串 if 语句。
    【解决方案2】:

    我必须回答,因为我这里有很多代码。我现在让事情运行起来。但是有一个有趣的错误:)

    NSString *str1 = (NSString *)obj1;
    NSString *str2 = (NSString *)obj2;
    
    if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"progress"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"ready"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"done"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"entered"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"ready"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"done"]) {
        return (NSComparisonResult) NSOrderedAscending;
    }
    else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"entered"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"progress"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"done"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"entered"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"progress"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"ready"]) {
        return (NSComparisonResult) NSOrderedDescending;
    }
    else {
        return (NSComparisonResult) NSOrderedSame;
    }
    

    现在的错误是:当我更改订单方向 (ascending:YES / NO) 时,我每两次订购 ascending:YES 时方向都是正确的(输入、进行、准备、完成)。否则有点错误:进入、进展、完成、准备。

    有没有人可以想象为什么或有解决方案?这不是一个严重的错误,但我想修复它。

    谢谢,Mundi,但我想我会继续使用我的模糊风格。我对 Cocoa / Objective C 很陌生,现在这种方式对我来说更有意义。不过感谢您的努力!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2019-01-23
      相关资源
      最近更新 更多