在Objective C中使用多个谓词对NSArray进行排序

时间:2016-05-05 12:32:20

标签: objective-c sorting nsarray filtering nspredicate

我有一个包含一些核心数据对象的数组。每个对象都有三个属性,例如“import com.sun.deploy.net.URLEncoder; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; public class Main { public static void main(String[] args) { String address = "Санкт-Петербург"; try { URLEncoder.encode(address, "UTF-8"); } catch (Exception e) { System.out.print("BAD"); } System.out.println(address); HttpClient client = new HttpClient(); String request = "https://geocode-maps.yandex.ru/1.x/?geocode=" + address; GetMethod method = new GetMethod(request); String Lat="",Long=""; try { client.executeMethod(method); String s = method.getResponseBodyAsString(); System.out.print(s); } catch (Exception e) {} } } ”& “First Name

我想过滤&根据搜索字母对数组进行排序。最终列表应按此顺序排列:

  • 以名字开头的记录应与搜索文本一样首先出现
  • 以姓氏开头的记录与搜索文本一样应该是第二个
  • 包含名字的记录与搜索文本一样应该是第三个
  • 包含姓氏的记录与搜索文本一样应该排在第四位

我在创建谓词和排序描述符时感到困惑。有人可以帮忙吗?

修改

这是我的抓取结果控制器:

Last Name

但这似乎不起作用,意味着它不对对象进行排序。

1 个答案:

答案 0 :(得分:1)

  

但这似乎不起作用,意味着它不对对象进行排序。

你真的是说它没有排序,或者它没有按照你想要的方式排序吗?

NSSortDescriptor只需要一个键进行排序。在您具有主键和辅助键的情况下,只有在主键相等时才使用辅助键进行排序,例如,系列名称然后给出名称,然后存在诸如setSortDescriptors:之类的例程,其中包含一系列排序描述符。这是您在代码中设置的那种排序。

但是,这不是您在项目符号中指定的那种。您的排序需要访问多个密钥来确定顺序 - 它说第一个密钥符合特定条件然后对该密钥排序,否则如果第二个密钥满足特定条件,则对该密钥进行排序,等等。执行此类排序你可以写一个NSComparator块,它可以访问完整的对象 - 而不仅仅是特定键的值 - 并将你的算法作为测试和比较的组合来实现。

不幸的是,NSFetchRequest不直接支持第二种排序。相反,您需要在不进行排序的情况下获取结果,然后使用sortedArrayUsingComparator:等方法对结果数组进行排序。

有关相关问题,请参阅NSSortDescriptor: Custom comparison on multiple keys simultaneously

HTH