我正在尝试使用自定义字母顺序对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;
}
}];
我也试过只使用单词的第一个字母,但它也没有用。
当我使用这个比较器时,它只是没有命令resp。数组保持“旧”顺序。
我吃错了什么?我不理解排序比较器吗?
感谢您的帮助,亲切的问候,Julian
答案 0 :(得分:0)
我认为你的字符串方案不适合你想做的事情。要记录状态,最好使用不同的数据模型并在视图中处理相应的字符串。
一个常见的实现涉及enum
,如果你这样定义它会自动递增:
typedef enum {
entered = 0,
processed,
ready,
done
} State;
排序现在变得微不足道了。
您的state
应该是State
类型,它实际上是一个整数。如果要使用NSDictionary或NSArray,则需要将其包装在NSNumber
中,但如果您创建@property
类型为State
的自定义对象,则肯定会更具可读性。 / p>
答案 1 :(得分: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
(输入,进度,准备好,完成)。否则有点不对:输入,进度,完成,准备就绪。
有人能想象为什么或有解决方案吗?这不是一个严重的错误,但我想解决它。
谢谢,Mundi,但我想我会继续使用我的模糊风格。我对Cocoa / Objective C很陌生,这种方式对我来说更有意义。不过感谢您的努力!