2013-05-13 32 views
1

我筛选使用NSPredicate为什么我使用NSSortDescriptor的排序方法不能正常工作?

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

距离的原始值是什么样的?他们是数字,字符串吗?一切正常化到米? – 2013-05-13 15:21:16

+0

NSString * dist = [NSString stringWithFormat:@“%。2f km”,distance/1000]; – 2013-05-13 15:23:15

回答

5

的排序不正确,因为它将Distance解释为一个字符串,而不是一个数字。字符串是字典顺序,这意味着100.00 km进来的2.00 km面前,因为1100.00 km初始数字,小于22.00 km初始数字。

当代表距离时,您可以使用NSNumber代替NSString来修复该问题,或者通过填充所有具有零的值以达到相同的长度来强制使用相同数量的数字。

+0

好的,你可以添加一个按数字排序的例子吗? – 2013-05-13 15:27:41

+0

@PavelKaljunen看看[这个答案](http://stackoverflow.com/a/9674876/335858),它提供了一个如何处理这个问题的例子,而不需要改变你存储在'Distance'属性中的数据。 – dasblinkenlight 2013-05-13 15:32:07

+2

sortDescriptorWithKey:@“Distance.doubleValue”为我工作 – 2013-05-13 15:42:01

2

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

相关问题