【问题标题】:Preventing duplicate NSArrays (one sorted, one unsorted)防止重复的 NSArrays(一个已排序,一个未排序)
【发布时间】:2010-11-21 20:48:22
【问题描述】:

我有一个 NSArray 对象,它是无序的。它是从互联网上更新的,所以我不能订购一次并保证以后再订购。

每个项目对应一个表格视图单元格,但用户可以重新排序,表格视图中有 2 个部分,尽管一开始所有单元格都在一个部分中。

所以我可以创建一个重复的 NSArray 并对其进行排序。并将其保存到硬盘中。 但这似乎很浪费,当通过互联网更新将新对象添加到无序 NSArray 中/从无序 NSArray 中删除时我该怎么办。

总之:

  • 如何让一个无序的 NSArray 和一个有序而不重复(并且浪费内存)?

  • 当用户没有为新对象/单元格设置位置时,我该如何处理对无序数组的更新?

【问题讨论】:

  • 为什么要将第二个数组保存到磁盘?
  • 我需要保存两个数组,因为无序数组每 24 小时不能下载超过一次。并且有序数组根据用户拖动表格视图的单元格进行排序。

标签: iphone objective-c cocoa cocoa-touch nsarray


【解决方案1】:

你的问题不是很清楚:

  • 数组是一个“有序集合”根据定义(除了带有“关联数组”的奇怪语言)。
  • “排序”与“排序”不同。 [1, 2, 3] 已排序; [1, 3, 2] 没有排序,但它是有序的(假设是通常的比较器)。
  • “防止重复的 NSArrays”是一个无用的主题。

所以我不得不猜测你想说什么:

  • 您有一个从 Internet 下载的内容列表。
  • 您有时会更新已下载内容的列表。
  • 用户可以重新排序列表。
  • 您希望能够更新事物列表但保留用户的排序。

嗯,首先你需要一些方法来找出两个列表中的哪些项目是“等价的”。例如,第一个列表是[Apple,Banana,Orange],用户将其按果汁偏好顺序[Orange,Apple,Banana]。如果第二个列表是 [apple,banana,orange](因为您决定所有内容都应该小写,并且需要大写的事情可以使用 -[NSString capitalizedString] 或其他方式完成),您需要一种方法来确定 Apple = apple 并构建一个新列表 [orange, apple,banana]。

不清楚为什么你认为你必须保存原始列表——是的,这意味着你可以说“Apple 和 apple 都在索引 0,所以它们是相同的”,但这也意味着你永远不能更改默认顺序,也永远不能删除一个项目(你可以用占位符替换它,但是嗯)。

有两种简单的解决方案:

  • 保留索引列表(例如,您将存储 [2, 0, 1],因为 Orange 在索引 2 处,等等)。这有点痛苦。如果你想使用 NSArray,最简单的方法是把东西包装在 NSNumber 中。
  • 不关心原始顺序。假设您有一个“用户排序”列表 [Orange, Apple, Banana] 和一个新的“服务器排序”列表 [apple,grape, orange]。遍历用户排序列表,从服务器排序列表中挑选出“等价的”项目以获得 [orange, apple] 和 [grape]。然后对“新”项目做一些理智的事情,比如把它贴在最后得到[橙子、苹果、葡萄]。 (在本例中,Banana 已被删除;我们处理这种情况时只是不将其包含在新列表中。)

【讨论】:

  • 我的意思是未排序,抱歉我不知道区别,但是这些项目不一定具有与更新数组之前相同的顺序或排序(来自互联网)
【解决方案2】:

如果它们都引用相同的对象(而不是副本),那么额外的内存将非常少(NSArray 开销和指针),并且可能不值得担心。

【讨论】:

  • @Jonathan,即使是最大容量的 Mac Pro 也“只有”32 GB 的 RAM,而即使是最小的 MacBook Air 也“只有”64 GB 的长期存储空间。 RAM 是更稀缺的资源。如果 RAM 不值得担心,那么长期存储至少是不值得担心的两倍。
  • 我没有在问题中提到,但它被标记为 iPhone。
  • 如果行实际上那么大,您可能想要做的是将第二个数组作为 UUID 或索引存储到第一个数组中。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2017-01-07
  • 2014-09-18
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多