0

我想按自定义字母顺序对NSArray进行排序。协议是我有一个包含对象状态的字符串数组。NSSortDescriptor自定义字母数字顺序

可用状态是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; 
    } 
}]; 

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

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

我吃错了什么?我不明白排序比较对吗?

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

回答

0

我必须回答,因为我在这里得到了很多代码。我现在正在运行。但有一个有趣的错误 :)

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(进入,进步每一秒的时间,准备好了,完成了)。否则,它有点不对劲:进入,进展,完成,准备就绪。

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

谢谢,蒙迪,但我想我会继续使用我的模糊风格。我对Cocoa/Objective C非常陌生,现在这种方式对我来说更有意义。尽管如此,谢谢你的努力!

0

我认为,随着琴弦你的计划是不适合你正在尝试做的。要记录状态,最好使用不同的数据模型并在视图中处理适当的字符串。

常见的实施涉及的enum,它会自动增加,如果你定义它是这样的:

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

排序现在变得微不足道。

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

+0

Hey Mundi!伟大的方法,谢谢!但现在:我怎样才能将NSString(使用状态名称)转换为_state_类型的对象?我无法更改数据库中的表示形式,因为我的应用程序“仅仅”是基于Web的应用程序的iOS包装器。 **虽然谢谢**! – 2012-04-02 22:02:58

+0

与其他JSON或XML“字段”相同。将它们逐个匹配到您的自定义对象的属性。在这种情况下,可能只是一串if语句。 – Mundi 2012-04-02 23:36:42