对获取的结果控制器进行排序,最后是空字符串

Posted

技术标签:

【中文标题】对获取的结果控制器进行排序,最后是空字符串【英文标题】:Sorting a fetched results controller, empty strings last 【发布时间】:2017-04-18 03:56:03 【问题描述】:

假设我在 Core Data 存储中有一个 Person 实体。我有一个由 NSFetchedResultsController 填充的 UITableView,它显示了每个 Person 实体。当然,Person 实体有一个name 属性,这是可选的。我们想按字母顺序显示列表,A-Z。看到此内容的用户希望首先查看已命名的人,因为他们会更关心这些人。因此,控制器在其初始化程序中采用的排序描述符必须首先显示具有非空名称的Person 实体,然后是空名称。

我的选择是有限的。在访问数据库时,我只被允许使用NSString 上提供的某些比较器,这些比较器都不符合我的标准。我无法对瞬态值进行排序。我尝试使用零宽度空白作为默认值,但 Core Data 显然将空白修剪掉了。想法?

【问题讨论】:

【参考方案1】:

fetchedResultsController 中的部分不需要与您在 tableview 中显示的部分一一对应。现在你有类似(null),A,B,C,D,......等的部分。但是您可以更改视图控制器选择显示这些部分的方式。在您的表格视图中设置第 0 部分查看 fetchedResultsController 中的第 1 部分和 1->2、2->3...直到最后一个部分(无名称部分)指向第 0 部分。

这并不复杂,但它会给您的代码添加混乱。所以我建议创建一个单独的对象来处理将 fetchedResultsController indexPaths 和 section 转换为 tableview 的 indexPaths 和 section。 (还要确保处理没有“no name”部分的情况,以及只有“no name”部分的情况)。

如果这看起来太复杂,一个更简单的解决方案是添加hasName 的属性并首先按该属性排序。为该人的姓名创建一个自定义设置器,该设置器还将设置 hasName 属性,以便您可以轻松地保持此属性同步。

【讨论】:

我只在一个部分中显示名称,但hasName 的建议听起来可行。

以上是关于对获取的结果控制器进行排序,最后是空字符串的主要内容,如果未能解决你的问题,请参考以下文章

1099.后缀子串排序

JAVA用递归来判断回文串

Oracle数据库空字符串和空字符串比较的问题

c# 对json串排序

模式匹配算法

数据结构串---BF算法(朴素模式匹配)