为什么我使用NSSortDescriptor的排序方法效果不好?

时间:2013-05-13 15:18:21

标签: ios nsmutablearray nspredicate nssortdescriptor

我使用NSPredicate

过滤我的表格结果
   NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"Name CONTAINS[cd] %@ OR Address CONTAINS[cd] %@",
                                    searchText,
                                    searchText];

    searchResults = [NSMutableArray array];

    for (key in dict) {

        if ([resultArray containsObject:key]) {

            NSArray *array = [dict objectForKey:key];
            matches = [array filteredArrayUsingPredicate:resultPredicate];

            if (matches.count > 0) {

                [searchResults addObjectsFromArray:matches];
                // sorting array
                NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"Distance" ascending:YES];
                [searchResults sortUsingDescriptors:[NSArray arrayWithObject:sort]];
            }

        }
    }

    }

然后我使用NSSortDescriptor

对结果数组进行排序
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"Distance" ascending:YES];
                [searchResults sortUsingDescriptors:[NSArray arrayWithObject:sort]];

它有效,但不是所有结果:

enter image description here

2 个答案:

答案 0 :(得分:5)

排序不正确,因为它将Distance解释为字符串,而不是数字。字符串按字典顺序排序,意味着100.00 km位于2.00 km前面,因为1的最初数字100.00 km小于2 {1}},2.00 km的初始数字。

您可以在表示距离时使用NSNumber代替NSString来修复此问题,或者通过用零填充所有值来强制使用相同的位数来实现相同的长度。

答案 1 :(得分:2)

您应该对数字进行排序,这是以米为单位的标准化距离,而不是显示字符串(对数字中的字符串排序需要不同的逻辑)。