在NSMuttableArray中获取(NSDictionary)s的密钥的所有类似值

时间:2014-04-24 11:10:46

标签: 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";
    MedicineDateTime = "24/04/2014 16:00:26";
},
{
    MedicineAlarmTime = "19:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
}
)

是否可以检索类似“MedicineAlarmTime”的数组,如

array1 = (
{
    MedicineAlarmTime = "18:00:00";
    MedicineDateTime = "24/04/2014 16:00:09";
},
{
    MedicineAlarmTime = "18:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
}
)

array2 = (
{
    MedicineAlarmTime = "19:00:00"
    MedicineDateTime = "24/04/2014 16:00:09";
},
{
    MedicineAlarmTime = "19:00:00";
    MedicineDateTime = "24/04/2014 16:00:26";
}
)

2 个答案:

答案 0 :(得分:3)

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,groupedAlarmsgroupedAlarms中的键是原始数组中字典的闹钟时间 - 实际的闹钟时间值。每个键的值都是数组。数组包含原始数组的字典 - 根据警报时间(用作包含它们的数组的键)进行排序。


如果您希望上面示例中的“alarmGroup”更加通用而不是仅与组完全匹配,则可以使用相同的forin循环结构。用于确定是将其放入现有组还是创建新组的检查变得稍微复杂一些,但重要的是,我们仍然不需要预先排序数组,然后再次遍历它。

我可以看到预排序的唯一原因是,如果您有一组所需的组,并且每组中有一定数量的对象。然后,您无法真正知道将每个对象放入哪个组,直到对数组进行排序。

但是在这里,我们试图将对象放在具有相似对象的组中,因此算法很简单:

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

对于任何downvoters ......除非原始问题更清楚,否则我无法提供比本答案中现有示例代码更复杂的示例的示例代码。

答案 1 :(得分:0)

不确定。你只需要为它编写代码。

首先,您使用NSArray方法sortedArrayUsingDescriptor:来获取一个按MedicineAlarmTime排序的数组,因此您可能想要的数组元素实际上将在一起。然后迭代遍历数组,比较MedicineAlarmTime以检查两个数组元素是否相似"类似"足够你,并使用NSArray方法subArrayWithRange创建包含这些组的数组: