【问题标题】:NSTableColumn sorts numbers wronglyNSTableColumn 错误地对数字进行排序
【发布时间】:2013-06-04 03:26:13
【问题描述】:

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

它从包含字符串的保留 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(s) 的 NSMutableArray(s) 的填充方式:

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];

【问题讨论】:

  • 你这里的数据源是什么?一个 NSArrayController 用数字填充还是 NSMutableArray 用数字填充?无论哪种方式,在 for 循环中,如果不进行一些转换,您就不能将 NSString 分配给 NSNumber。

标签: objective-c sorting nsmutablearray nsdecimalnumber nstablecolumn


【解决方案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];
}];

【讨论】:

  • 是的,谢谢!但是我现在有一些分散的数字,显示太多后十进制数字,我该如何解决?
  • 是的,我使用了这种方法stackoverflow.com/questions/4026135/…,但它仍然很少显示一些带有大量后十进制数字的数字。
  • 现在问题是,它似乎也是因为我只用 NSMutableDictionary 填充 NSTableView (包含列的 NSMutableArrays),让应用程序对数据本身进行排序,以某种方式使其全部错误,列中的值与其他列数据不匹配。顺便说一句,我在重新填充和重新加载 NSTableView 时使用了重复的 NSTimer。
  • @JeremiahSmith 如果您愿意,可以尝试使用NSDecimalNumber 而不是NSNumber(参见修订后的答案)。或者,您可以在显示表格时进行适当的舍入。无论哪个有效。
  • 我的意思是 NSTableView 的数据源使用 NSMutableDictionary 一次性获取。在此之前,所有数组都一个接一个地加载动态数据,然后在 NSMutableDictionary 中汇总在一起,但它们不匹配...
【解决方案2】:

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

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

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

你有NSArrayController 方法:

- (void)setSortDescriptors:(NSArray *)sortDescriptors

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

这样,您将获得用于表格的排序数组。 也许您需要调用 NSTableView 的reloadData

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

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 2022-12-11
    • 2015-02-14
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多