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

Ios 从字典中的引用中删除数组中的特定对象,ios,arrays,dictionary,Ios,Arrays,Dictionary,我的问题: 我需要知道我所做的是不是最好的方法,如果不是,是什么 情况: 我在数组中有“联系人”对象。这些联系人必须按字母顺序排列,并且可以有多个电话号码。我把这个数组分成27个联系人数组,每个联系人代表字母表中的一个字母。所以我有我所有的“A”联系人,然后是“B”等等。 此外,在“拆分”过程中,我还在字典中添加了每个联系人的引用,其中对象是联系人,键是他的电话号码 因为一个联系人可以有X个电话号码,所以字典中X个不同条目中可能有X次相同联系人。我需要它,这样我就可以找到任何号码的联系人 所有这

我的问题:

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

情况:

我在数组中有“联系人”对象。这些联系人必须按字母顺序排列,并且可以有多个电话号码。我把这个数组分成27个联系人数组,每个联系人代表字母表中的一个字母。所以我有我所有的“A”联系人,然后是“B”等等。 此外,在“拆分”过程中,我还在字典中添加了每个联系人的引用,其中对象是联系人,键是他的电话号码

因为一个联系人可以有X个电话号码,所以字典中X个不同条目中可能有X次相同联系人。我需要它,这样我就可以找到任何号码的联系人

所有这些都很有魅力

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

我在问什么与我在做什么:

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

我想做的是:考虑到我的字典中有联系人对象的引用,以某种方式清理我找到的用户数组

TL;医生: 我的阵列:

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

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

我的字典:

  • a1-电话1
  • a1-电话2
  • a1-电话3
  • a2-电话1
  • a3-电话1
终极问题:

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

我还将每个联系人的引用添加到字典中,其中的对象是联系人,关键是他的电话号码

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

在这里,您应该仔细考虑您的模型和演示文稿。一个数据结构应该是真理的唯一来源。通常这将是你的一大份联系人名单。这与它的显示方式毫无关系。我们称之为模型。它通常作为
NSSet
进行跟踪,因为顺序并不重要

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

关于你的分区问题:你有一个联系人列表,你想根据他们的电话号码是否出现在另一个列表中将他们分成两组。如果你的总列表只有几十个条目,坦白地说,你怎么做并不重要。对于足够小的n,即使是O(n^2)也可以。首先关注使其简单可靠,然后使用仪器分析,以了解真正的瓶颈在哪里

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

但我可能只是把所有的电话号码放在一个集合中,然后使用
成员:
来查找它们。这通常比较容易