NSTableColumn错误地排序数字

时间:2013-06-03 18:13:23

标签: objective-c sorting nsmutablearray nsdecimalnumber nstablecolumn

这是一个NSTableView,其IB绑定到NSArrayController,它正确显示所有值。
然而,它仅按其第一个char值对数字进行排序,例如它将115.31低于2.5,低于4.71等23.9等。

它从保留的带有字符串的NSMutableArray获取值,我也尝试将所有字符串转换为NSNumber / NSDecimalNumber,但仍然没有运气:

NSMutableArray *array1 = [[string1 componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]] mutableCopy];

NSMutableArray *array1alt = [NSMutableArray array];

for(NSString *strNum in array1)
{
    NSNumber *number = strNum;
    [array1alt addObject:number];
}

请帮助,谢谢。

编辑:这就是我的NSTableColumn的NSMutableArray的填充方式:

NSMutableArray *rows = [NSMutableArray array];

for (NSUInteger i = 0; i < array1alt.count && i < array2.count && i < array3.count && i < array4.count; i++)
{
    NSMutableDictionary *row = [NSMutableDictionary dictionary];
    [row setObject:[array1alt objectAtIndex:i] forKey:@"Apples"];
    [row setObject:[array2 objectAtIndex:i] forKey:@"Oranges"];
    [row setObject:[array3 objectAtIndex:i] forKey:@"Peaches"];
    [row setObject:[array4 objectAtIndex:i] forKey:@"Plums"];
    [rows addObject:row];
}

[myArrayController2 setContent:rows2];
[aTableView reloadData];

2 个答案:

答案 0 :(得分:1)

我很惊讶您没有收到编译器警告:

NSNumber *number = strNum;

你可能想要:

NSNumber *number = [NSNumber numberWithDouble:[strNum doubleValue]];

或者更简单:

NSNumber *number = @([strNum doubleValue]);

如果您不想处理输出上的数字转换,您可以像这样对原始字符串数组进行排序:

NSArray *array2 = [array1 sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
    double num1 = [obj1 doubleValue];
    double num2 = [obj2 doubleValue];
    if (num1 < num2)
        return NSOrderedAscending;
    else if (num1 > num2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}];

如果你想使用十进制数字,你可能会做类似的事情:

NSMutableArray *array2 = [NSMutableArray array];
for (NSString *strNum in array1)
{
    [array2 addObject:[NSDecimalNumber decimalNumberWithString:strNum]];
}

[array2 sortUsingComparator:^NSComparisonResult(NSDecimalNumber *obj1, NSDecimalNumber *obj2) {
    return [obj1 compare:obj2];
}];

答案 1 :(得分:0)

没有看到更多代码,这就是我的想法:

如果我理解正确,你将NSArrayController作为数据源。

您需要在将数据附加到表格之前对其进行排序。

您有NSArrayController种方法:

- (void)setSortDescriptors:(NSArray *)sortDescriptors

- (NSArray *)arrangeObjects:(NSArray *)objects

有了这个,你将获得用于你的表的排序数组。 也许您需要致电NSTableView的reloadData

我现在无法测试这些,因为我现在在我的笔记本电脑上没有MacOS:)