防止重复的NSArrays(一个已排序,一个未排序)

时间:2010-11-21 20:48:23

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

我有一个NSArray对象,它是无序的。它是从互联网更新的,因此我无法订购一次,并保证以后的订单。

每个项目对应一个表格视图单元格,但用户可以重新排序这些项目,并且在tableview中有2个部分,但首先是所有单元格都在一个部分中。

所以我可以创建一个重复的NSArray并订购它。并将其保存到硬盘驱动器。 但这似乎是一种浪费,当通过互联网更新向无序NSArray添加/删除新对象时,我该怎么办。

总而言之:

  • 我如何拥有一个无序的NSArray,一个没有重复的订购(以及浪费内存)?

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

2 个答案:

答案 0 :(得分:3)

你的问题不是很清楚:

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

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

  • 您有从互联网上下载的内容列表。
  • 您偶尔会更新已下载的内容列表。
  • 用户可以重新排序列表。
  • 您希望能够更新事物列表,但保留用户的订购。

嗯,首先你需要一些方法来找出两个列表中的哪些项目是“等效的”。例如,第一个列表是[Apple,Banana,Orange],用户将其置于果汁优先顺序[Orange,Apple,Banana]。如果第二个列表是[apple,banana,orange](因为你决定一切都应该是小写的,并且需要大写的东西可以使用-[NSString capitalizedString]或其他),你需要一种方法来确定Apple = apple并构建一个新列表[orange,apple,banana]。

目前尚不清楚为什么你认为你必须保存原始列表 - 是的,这意味着你只能说“苹果和苹果都在索引0,所以它们是相同的”,但这也意味着你永远不能更改默认订单,您永远不能删除项目(您可以用占位符替换它,但是meh)。

有两种简单的解决方案:

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

答案 1 :(得分:2)

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