NSSortDescriptor自定义字母数字顺序

时间:2012-03-30 16:36:17

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

我正在尝试使用自定义字母顺序对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

2 个答案:

答案 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很陌生,这种方式对我来说更有意义。不过感谢您的努力!