【问题标题】:How to group object in NSMutableArray and divide to separate NSMutableArray in Objective-C如何在 NSMutableArray 中对对象进行分组并在 Objective-C 中划分为单独的 NSMutableArray
【发布时间】:2018-07-25 09:54:06
【问题描述】:

我有这样的 NSMutableArray:

// NSMutableArray *Data = (NSMUtableArray(NSDictionary))
       Data = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.03"},
       {"Device": "A2", "Temperature": "25", "datetime": "2013.02.03"},         
       {"Device": "A3", "Temperature": "25", "datetime": "2013.02.03"},        
       {"Device": "A1", "Temperature": "25", "datetime": "2013.02.04"},
       {"Device": "A2", "Temperature": "25", "datetime": "2013.02.04"}.

如何按照“日期时间”将其分解并分组为单独的 NSMutableArray。如上案例将分为:

Data_d1 = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.03"},
          {"Device": "A2", "Temperature": "25", "datetime": "2013.02.03"},
          {"Device": "A3", "Temperature": "25", "datetime": "2013.02.03"}

Data_d2 = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.04"},
          {"Device": "A2", "Temperature": "25", "datetime": "2013.02.04"}

【问题讨论】:

  • 你想根据什么来分解它们?
  • 我认为基于日期“2013.02.04”和“2013.02.03”
  • @Jacky - 如果有超过 2 个日期怎么办。你想根据 n 个差异日期制作 n 个数组吗?
  • @Rizwan 是的,我想将其设为“n”个日期(以上数据只是一个示例)
  • @JackyLe - 好的,所以我给出的答案应该已经适用于“n”个元素。如果解决方案有效并且您喜欢它,您可以投票赞成:)。

标签: ios objective-c macos nsmutablearray nsarray


【解决方案1】:

您可以使用以下代码实现它:

let data:[[String: String]] = [
        ["Device": "A1",
         "Temperature": "25",
         "datetime": "2013.02.03"],

        ["Device": "A2",
         "Temperature": "25",
         "datetime": "2013.02.03"],

        ["Device": "A3",
         "Temperature": "25",
         "datetime": "2013.02.03"],

        ["Device": "A1",
         "Temperature": "25",
         "datetime": "2013.02.04"],

        ["Device": "A2",
         "Temperature": "25",
         "datetime": "2013.02.04"]]

    let dateTimeArray = data.compactMap({ $0["datetime"] })
    let uniqueDateTimeArray = Array(Set(dateTimeArray))

    var desiredSeparatedArray = [[[String: String]]]()
    for dateTime in uniqueDateTimeArray {
        var arrayForDateTime = [[String: String]]()
        for element in data {
            if element["datetime"] == dateTime {
                arrayForItem.append(element)
            }
        }
        desiredSeparatedArray.append(arrayForDateTime)
    }

最后的desiredSeparatedArray就是答案!!

【讨论】:

  • 能不能写在objective-C下
  • 目标 C 代码只会是类似的,我想如果你理解了答案,那么你应该能够编写它。如果有什么您无法获得的,请告诉我。
【解决方案2】:

如果你有这样的字典数组:

var data = [["Device": "A1", "Temperature": "25", "datetime": "2013.02.02"],
["Device": "A2", "Temperature": "25", "datetime": "2013.02.03"],
["Device": "A3", "Temperature": "25", "datetime": "2013.02.03"],
["Device": "A1", "Temperature": "25", "datetime": "2013.02.04"],
["Device": "A2", "Temperature": "25", "datetime": "2013.02.04"]]

然后您可以根据任何键将它们隔离如下:

var dateArray = data.compactMap{ $0["datetime"] }
let uDateArray = Array(Set(dateArray))
var segregatedArray = [[[String: String]]]()
for dateTime in uDateArray {
    segregatedArray.append(data.filter{$0["datetime"] == dateTime})
}
print(segregatedArray);

根据请求添加以字典数组作为原始数据的 Objective-C 版本。

假设您有如下字典数组:

 NSArray *array=@[
     @{@"Device": @"A1",@"Temperature":@"25",@"datetime":@"2013.02.03"},
     @{@"Device":@"A2",@"Temperature":@"25",@"datetime":@"2013.02.03"},
     @{@"Device":@"A3",@"Temperature":@"25",@"datetime":@"2013.02.03"},
     @{@"Device":@"A1",@"Temperature":@"25",@"datetime":@"2013.02.04"},
     @{@"Device":@"X1",@"Temperature":@"26",@"datetime":@"2013.02.07"},
     @{@"Device":@"Y1",@"Temperature":@"27",@"datetime":@"2013.02.07"},
     @{@"Device":@"A2",@"Temperature":@"25",@"datetime":@"2013.02.04"}];

然后你可以将它们隔离如下:

    NSMutableDictionary* mutableDic = [[NSMutableDictionary alloc] initWithCapacity:1];
    for (NSDictionary* dic in array) {
        NSString* dateTime = [dic valueForKey:@"datetime"];
        NSMutableArray* data = [mutableDic valueForKey:dateTime];
        if(data != nil)//data with this key avalaibe, add further.
        {
            [data addObject:dic];
        }
        else//data with this key not avalaibe, make a mutable array with this dic and add.
        {
            NSMutableArray* newData = [[NSMutableArray alloc] initWithObjects:dic, nil];
            [mutableDic setValue:newData forKey:dateTime];
        }
    }
    NSLog(@"%@", mutableDic);

您可以根据任何键进行隔离,只需将该键放在这里[dic valueForKey:@"datetime"];。您可以按照评论中的要求输入Device,而不是datetime

分离后的调试器截图:

【讨论】:

  • 是由 Objective-C 编写的代码。好像不是。你能把它改成目标C
  • 这段代码是用 Swift 编写的。如您所问,我还将为此添加 Objective-C 版本。不过我建议你现在就开始学习/使用 swift :)
  • 是的,我正在学习。从 Objective-C 开始,然后将转向 swift。你能分享一下objective-c的代码吗
  • 是的,我会在某个时候这样做,一旦我回到我的 MAC 上。我要做的是遍历当前 NSMutableArray 中的每个元素,然后根据 dateTime 将其隔离在 NSMutableDisctionary 中,键为 dateTime。这样,diff dateTime 键将保存该 dateTime 的 NSArray。通过这种方式,您可以轻松查询任何特定日期的数据。
  • 谢谢。实际上我的日期时间字符串是:“2018-07-04 16:09:22”,我只想按日期分组“2018-07-04”。
【解决方案3】:

试试这个

let array = Data as! [[String:String]]

let dictionary = Dictionary(grouping: array, by: {$0["datetime"]!})
var listOfArray = [[[String:String]]]()
dictionary.forEach({listOfArray.append($0.value)})

listOfArray 将包含你所有的数组

【讨论】:

  • 你能分享一下如何在Objective C中做到这一点
猜你喜欢
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多