从字典中的引用中删除数组中的特定对象

时间:2014-12-04 13:15:33

标签: ios arrays dictionary

我的问题:

我需要知道我所做的是最好的方式,如果不是,那是什么?

情况:

我有"联系人"数组中的对象。这些联系人必须按字母顺序排序,并且可以有多个电话号码。我将该数组拆分为27个联系人数组,其中每个联系人都会重新呈现字母表中的字母。所以我拥有所有的" A"接触,然后" B"等等。 此外,在"拆分"期间,我还在字典中添加每个联系人的引用,其中对象是联系人,密钥是他的电话号码。

因为一个联系人可以拥有X个电话号码,所以在字典中的X个不同条目中可以有相同联系人的X倍。我需要,所以我可以找到任何号码的任何联系。

以上所有的作品都像魅力一样。

现在我需要比较我的在线数据库中的所有这些数字(注意:我使用解析),看看其中一些联系人是否已经是用户。如果是,则需要将它们放在我的tableview的特定部分。 (我的tableview只是所有联系人,以字母部分分隔,+ 1"用户"部分)。并且联系人不能出现在用户部分和字母部分中。如果联系人是用户,则必须将其分开。

我在问什么,我在做什么:

现在,我只是重新循环每个阵列,并将每个元素与我在网上找到的所有用户进行比较。这是一个很多循环,看起来浪费时间和资源。

我想做什么:以某种方式清理我发现的用户数组,考虑到我在字典中有联系对象的引用。

TL; DR:

我的阵列:

第一部分中的用户,然后按字母顺序联系

[[user1,user2,user3,...],[a1,a2,a3,...],[b1,b2,...],...]

我的字典:

  • a1 - phone1
  • a1 - phone2
  • a1 - phone3
  • a2 - phone1
  • a3 - phone1
  • ...

最终问题:

我可以很容易地找到联系对象(因为我的在线数据库中有他的号码)。如果我从字典中与a1交互,它是否也会更改数组数组中的a1? 更具体地说,考虑到我不知道他在哪一个,我可以以某种方式从阵列中删除它吗?

1 个答案:

答案 0 :(得分:0)

  

我还在字典中添加每个联系人的引用,其中对象是联系人,密钥是他的电话号码。

你需要非常小心这种方法。它可能会发生碰撞。虽然手机号码通常是独一无二的,但有时它们是共享的。家庭和工作号码通常是共享的。电话号码会被重新分配,因此您的数据库也可以通过这种方式获得重复数据。有时人们只输入错误的数据。在这些情况下,您必须确保系统的行为合理且一致。许多行为都很好,但“随机选择一个”通常不是。

您应该仔细考虑一下您的模型是什么以及您的演示文稿是什么。一个数据结构应该是单一的事实来源。通常情况下,这将成为您的联系人名单。这与它的显示方式毫无关系。我们称之为模型。由于订单无关紧要,因此通常会将其跟踪为NSSet

上面你应该有一个处理分组和排序问题的“视图模型”。这不是“真相”。只要基础数据发生广泛变化,您就应该愿意抛弃它。它的数据结构应该指向底层模型,并且应该以与表视图所需的完全匹配的方式存储。保持模型和视图模型分离是控制复杂性的最佳方法之一。然后你知道数据只有一个地方可以改变(模型),其他一切只会对此做出反应。

关于您的分区问题:因此您有一个联系人列表,并且您希望根据他们的任何电话号码是否出现在另一个列表中将它们分成两组。如果您的总列表只有几十个条目,那么坦率地说,如何执行此操作并不重要。即使O(n ^ 2)也足够小 n 。首先关注简单可靠,然后使用Instruments查看真正的瓶颈所在。

也就是说,通常确定集合交集的最快方法是对两个集合进行排序并同时遍历它们。所以你要创建一个“联系人”数组“电话号码+联系人指针”和一个只有电话号码的“用户”数组。按电话号码对它们进行排序。遍历它们,比较每个列表的当前元素,然后递增较小列表的索引。如果不匹配,请将联系人放在一个列表中。如果是匹配,请将其放入另一个。

但我可能只是将所有电话号码都放在一个集合中并使用member:来查找它们。这通常更容易。