从过滤器列表和原始列表中删除项目

Posted

技术标签:

【中文标题】从过滤器列表和原始列表中删除项目【英文标题】:Remove item from filter list as well as from original list 【发布时间】:2018-03-11 17:03:10 【问题描述】:

我正在处理UISearchBar Swift 4.0。我有originalList[ModelItem]filterList[ModelItem]。在搜索时,假设用户想要删除 filterList 的第 5 个位置,这是实际 originalList 上的第 10 个项目。从两个列表中删除此项目是否有意义?项目没有 id 或类似类型字段。

这种双向删除的基本步骤是什么?我一直在寻找实现这一目标的总体思路。

【问题讨论】:

【参考方案1】:

如果模型是一个类并且filterList 是直接从originalList 创建的(没有创建新对象,但两个列表引用相同的对象),那么您可以使用此代码:

let itemToDelete = filterList.remove(at: indexPath.row)
if let index = originalList.index(where:  $0 === itemToDelete ) 
    originalList.remove(at: index)

print(originalList)
print(filterList)

=== 运算符将测试实例的相等性,从而确定要从 originalList 中删除的正确实例。

如果您使用struct 作为模型,则必须使用一些启发式方法来实现Equatable,即使没有显式标识符,也可以检测两个实例是否相等,然后使用@987654328 @ 在originalList 中找到要删除的正确实例。

另一种选择可能是使用索引方法实现搜索,它使用与您当前的过滤方法相同的过滤算法,但需要多一个参数 - filterList (filterIndex) 中的索引以及过滤文本,并基于此计算并返回originalList 中与提供的过滤器文本对和filterIndex 匹配的索引。

还有另一种选择,我不推荐(我称之为 hack) - 您可以保留从 originalListfilterList 的索引字典,您可以使用它在 originalList 和 @ 之间进行显式映射987654337@。但是,这将要求您始终更新该字典,无论对其中一个列表进行更改 - 每次搜索、每次删除或删除或插入都需要更新映射字典。这似乎很复杂且容易出错。

【讨论】:

【参考方案2】:

你有很多选择。

您可以维护原始和过滤项目位置之间的映射,因此您可以在两个列表上执行删除。 您可以使您的项目可识别,这样您就可以在原始列表中搜索相应的项目并将其删除。请注意,所有引用类型都可以进行身份​​测试 (===)。 您可以对原始列表使用过滤后的“视图”,而不是使用过滤后的副本,因此自然会在原始列表上执行删除。

我认为我们没有后一种选择的标准解决方案,这使得这种方法最复杂。

在选择前两个选项中的任何一个时,请注意在您对过滤后的副本进行操作时可能发生的原始列表更新。

【讨论】:

以上是关于从过滤器列表和原始列表中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?

vba,如何从列表框中的工作表中删除过滤后的数据

如何过滤和删除重复的 JSON 列表?

Sharepoint 2010列表视图阈值和项级别权限

过滤列表的算法

如何从另一个项目列表中过滤一个项目列表?