2013-05-13 71 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

您應該對數字進行排序,這是以米爲單位的標準化距離,而不是顯示字符串(對數字進行排序的字符串需要不同的邏輯)。