Ios 获取NSMuttableArray中一串(NSDictionary)的键的所有类似值

Ios 获取NSMuttableArray中一串(NSDictionary)的键的所有类似值,ios,nsmutablearray,nsmutabledictionary,Ios,Nsmutablearray,Nsmutabledictionary,我有一个NSMuttableArray,其值如下 ( { MedicineAlarmTime = "18:00:00"; MedicineDateTime = "24/04/2014 16:00:09"; }, { MedicineAlarmTime = "18:00:00"; MedicineDateTime = "24/04/2014 16:00:26"; }, { MedicineAlarmTime = "19:00:00"; Medicin

我有一个NSMuttableArray,其值如下

(
{
    MedicineAlarmTime = "18:00:00";
    MedicineDateTime = "24/04/2014 16:00:09";
},
{
    MedicineAlarmTime = "18:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
},
{
    MedicineAlarmTime = "19:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
},
{
    MedicineAlarmTime = "19:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
}
)
是否可以检索类似“MedicineArmTime”的数组


当然。你只需要为它编写代码

首先,使用NSArray方法sortedarrayusingsdescriptor:获取按MedicineArmTime排序的数组,以便您可能希望组合在一起的数组元素实际上会组合在一起。然后遍历数组,比较MedicineArmTime以检查两个数组元素是否足够“相似”,并使用NSArray方法subArrayWithRange使用这些组创建数组:

NSMutableDictionary *groupedAlarms = [NSMutableDictionary dictionary];

for (NSDictionary *alarm in originalArray) {
    NSString *alarmTime = [alarm objectForKey: MedicineAlarmTime];

    NSMutableArray *alarmGroup = [groupedAlarms objectForKey: MedicineAlarmTime]
    if (alarmGroup) {
        [alarmGroup addObject: alarm];
    } else {
        alarmGroup = [NSMutableArray arrayWithObjects: alarm, nil];
        [groupedAlarms setValue:alarmGroup forKey:alarmTime];
    }
}
这将创建一个NSMutableDictionary,
groupedAlarms
groupedAlarms
中的键是原始数组中字典中的报警时间——实际报警时间值。每个键的值都是数组。数组包含原始数组的字典——根据报警时间(用作包含它们的数组的键)排序


如果您希望上面示例中的“alarmGroup”更一般,而不是仅对精确匹配进行分组,则可以使用相同的
forin
循环结构。确定是否将其放入现有组或创建新组的检查变得稍微复杂一些,但重要的是,我们仍然不需要对数组进行预排序,然后再次对其进行迭代

我能看到的进行预排序的唯一原因是,如果您有一组您想要的组,并且每个组中都有一组对象。在数组排序之前,您无法真正知道将每个对象放入哪个组

但在这里,我们尝试将对象与相似对象分组,因此算法很简单:

抓住一个物体。查看它是否属于现有组。如果没有,请为此对象创建一个新组。移动到下一个对象


而对于任何失望的选民。。。我无法提供比本答案中现有示例代码更复杂的示例代码,除非原始问题更清楚。

对“类似值或键”进行澄清会有所帮助。是否要按类似的键对这些键进行分组?还是按相似的值?你的意思有多相似?18:59:30与19:00:30或18:00:30更相似吗?18点15分和18点差不多吗?还是它需要自己的团队?对不起,我在写作中犯了错误。我编辑了代码。现在检查。因此,如果medicine alarm time键的值相同,则应将它们排序到相同的数组中,否则应将它们排序到不同的数组中?“相似”的意思是“完全相同”?正如我刚才解释的。如果在多个词典中发现“MedicineArmTime”值“相同”,则它们将在不同的数组中分开。您在问题中没有实际解释这一点,标题为“相似”。这并不能解决最初发布的问题。正如最初发布的,警报时间很接近,但不同。最初发布的问题和你的答案一样模糊。此答案解决了在获得OP以澄清最初模糊的问题后当前发布的问题,并标记为已接受的答案。被否决的人几乎不需要。多么愚蠢的评论啊。海报想要相似的数字,而不是相等的数字。像“18:00:00”和“18:00:09”这样的时间在一起。NSDictionary不这么做。如果你很聪明的话,发布一些代码,不用排序就能更快地完成这项工作。有一种不用排序的更快的方法。我没有否决这个答案。你投了反对票,尽管我接受了,但你还是向我保证我的错了。不要和男人打架。冷静点。请原谅。那是我的错。我在陈述我的问题时犯了错误。
NSMutableDictionary *groupedAlarms = [NSMutableDictionary dictionary];

for (NSDictionary *alarm in originalArray) {
    NSString *alarmTime = [alarm objectForKey: MedicineAlarmTime];

    NSMutableArray *alarmGroup = [groupedAlarms objectForKey: MedicineAlarmTime]
    if (alarmGroup) {
        [alarmGroup addObject: alarm];
    } else {
        alarmGroup = [NSMutableArray arrayWithObjects: alarm, nil];
        [groupedAlarms setValue:alarmGroup forKey:alarmTime];
    }
}