代码之家  ›  专栏  ›  技术社区  ›  Jonathan.

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

  •  1
  • Jonathan.  · 技术社区  · 14 年前

    我有一系列的物品,都是乱七八糟的。它是从互联网上更新的,所以我不能一次订购,保证以后再订购。

    每个项目对应于一个表视图单元格,但是用户可以重新排序这些单元格,并且表视图中有两个部分,尽管从所有单元格开始都在一个部分中。

    所以我可以创建一个重复的nsarray并订购它。并将其保存到硬盘。 但这似乎是一种浪费,当一个新对象通过互联网更新添加到无序的NSARRAY中或从中删除时,我该怎么做呢?

    总而言之:

    • 我怎么会有一个无序的NSARRAY和一个有序的,没有重复(和浪费记忆)?

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   tc.    14 年前

    你的问题不太清楚:

    • 数组是“有序集合” 根据定义 (除了使用“关联数组”的奇数语言之外)。
    • “排序”与“排序”不同。[1,2,3]是排序的;[1,3,2]不是排序的,但它是排序的(假设是通常的比较器)。
    • “防止重复的非处方药”是一个无益的话题。

    所以我得猜你想说什么:

    • 您有一个从Internet下载的东西列表。
    • 您偶尔会更新下载的内容列表。
    • 用户可以对列表重新排序。
    • 您希望能够更新事物列表,但保留用户的顺序。

    首先,您需要某种方法来找出这两个列表中的哪些项是“等效的”。例如,第一个列表是[苹果、香蕉、橘子],用户将其按果汁偏好顺序[橘子、苹果、香蕉]。如果第二个列表是[苹果、香蕉、橘子](因为您决定所有东西都应该是小写的,需要大写的东西可以用 -[NSString capitalizedString] 或者其他),您需要一种方法来确定apple=apple并构建一个新的列表[橙色、苹果、香蕉]。

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

    有两种简单的解决方案:

    • 保留一个索引列表(例如,您将存储[2,0,1],因为橙色位于索引2,等等)。这有点疼。如果你想使用nsarray,最简单的方法是用nsnumber包装东西。
    • 不要在意最初的订购。假设您有一个“用户订购”列表[橙色、苹果、香蕉]和一个新的“服务器订购”列表[苹果、葡萄、橙色]。循环访问用户排序列表,从服务器排序列表中选择“等效”项以获取[橙色、苹果色]和[葡萄色]。然后对“新”物品做一些理智的处理,比如把它贴在末端以得到[橘子、苹果、葡萄]。(在本例中,香蕉已被删除;我们只是通过不将其包含在新列表中来处理此情况。)
        2
  •  2
  •   Wevah    14 年前

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