每次需要访问特定索引处的元素时是不是可以重新排序数组?

Posted

技术标签:

【中文标题】每次需要访问特定索引处的元素时是不是可以重新排序数组?【英文标题】:Is it ok to re-sort an array each time you need to access an element at a specific index?每次需要访问特定索引处的元素时是否可以重新排序数组? 【发布时间】:2010-12-03 18:34:44 【问题描述】:

我有一个 TableViewController,它显示了 CoreData 关系的元素列表。在我的 cellForRowAtIndexPath: 中,我从集合中获取一个 sortedArray,然后访问 indexPath.row 中的元素。然后在 didSelectRowAtIndexPath: 中,我也在做同样的事情。

这被认为是一种不好的做法吗?我看到了一个理论上的危险,如果我的排序方法在后续调用中返回一个不同排序的数组,我最终可能会与对象 B 交互,即使用户单击了显示对象 A 的单元格。对于我的排序返回一个不同排序的数组,但我仍然觉得这在技术上是有风险的。

我知道的唯一另一种方法是让我的 tableViewController 保留它自己的 NSArray 成员,当它第一次加载时,通过对集合进行排序来填充数组。唯一的问题是我必须分别维护集合和数组;每当用户更改某些内容时,都可以从两者中修改、插入或删除对象。这是否被认为是在表格中显示 CoreData 元素的“正确”方式?

【问题讨论】:

【参考方案1】:

我肯定会选择选项 B。即使您要维护模型数据和控制器中的数组,这也不会太困难。从控制器中添加/删除项目需要更新模型。您不仅可以解决冒着数据重复风险的问题,而且您会看到性能上的巨大提升,因为您每次调用时都不会获取新排序的数组。

【讨论】:

好吧,我只花了半个小时调试一个错误,这是因为我正在更新我的集合,然后期望我的 sortedArray 仍然反映我的 tableView 中的内容。所以我认为这几乎证明了你是对的。此外,虽然我并不真正关心性能(我的集合中只有 6 个元素),但当我不得不多次执行排序方法时,调试起来更加痛苦。【参考方案2】:

定义“好的”。如果您每次都以相同的方式对相同的键进行排序,则可能效率不高。另一方面,周期很便宜。如果您不担心性能并且这是最清晰的方法,那就去做吧。

您似乎在问“每次都以相同的方式排序”是所谓的“稳定排序”。问问自己这个问题:如果使用的不是键的顺序,那你为什么不按这些排序呢?

【讨论】:

以上是关于每次需要访问特定索引处的元素时是不是可以重新排序数组?的主要内容,如果未能解决你的问题,请参考以下文章

从现有列表中特定索引处的元素创建新列表

Java排序算法之插入排序

php中特定索引处的JSON未设置元素

将数组中的多个不相邻元素重新排序到特定索引的算法

选择排序-Java实现

重新排序 UITableView 单元格并跟踪索引