【问题标题】:How to implement "group by values" in NSMutableArray?如何在 NSMutableArray 中实现“按值分组”?
【发布时间】:2011-12-20 06:39:15
【问题描述】:

我正在使用 NSMutableArray。我想像在 SQL group by "log_date" 中那样按日期获取值。

logMuArray (
        {
        "log_currenttime" = "4:30pm";
        "log_date" = "11.12.2011";
        "log_duration" = "1:30";
    },
        {
        "log_currenttime" = "4:33pm";
        "log_date" = "11.12.2011";
        "log_duration" = "2:21";
    },
        {
        "log_currenttime" = "4:40pm";
        "log_date" = "11.12.2011";
        "log_duration" = "5:30";
    },
        {
        "log_currenttime" = "7:30pm";
        "log_date" = "12.12.2011";
        "log_duration" = "1:30";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "12.12.2011";
        "log_duration" = "2:21";
    },
        {
        "log_currenttime" = "7:40pm";
        "log_date" = "12.12.2011";
        "log_duration" = "5:30";
    },
        {
        "log_currenttime" = "07:16pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:07";
    },
        {
        "log_currenttime" = "7:31pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:04";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:03";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:06";
    },
        {
        "log_currenttime" = "7:35pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:05";
    }
)

**所以,我刚刚表演了......

 NSLog(@"logMuArray %@",[logMuArray valueForKey:@"log_date"]);

但我只想获取唯一的日期。** 我考虑过 NSPredicate 或 Mutable Set 等...

logMuArray (
    "11.12.2011",
    "11.12.2011",
    "11.12.2011",
    "12.12.2011",
    "12.12.2011",
    "12.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011"
)

提前谢谢.....

编辑:

我也听说过“@distinctUnionOfObjects”

......

【问题讨论】:

  • 是否可以基于两个或多个具有相同逻辑的键来唯一标识对象?
  • 你的问题很好,最好你问一个问题,因为代码也是需要的,所以请在堆栈溢出中问你的问题。并排我对此没有太多想法,但我需要时间来解决它。将尝试解决它,但需要一个代码来解决它。最好用代码在堆栈溢出处发布您的问题。谢谢

标签: iphone objective-c cocoa-touch nsmutablearray


【解决方案1】:

Shanti 的答案很接近。您想使用键值编码集合运算符@distinctUnionOfObjects。将运算符放在您希望它影响的键之前,就好像它是您正在访问的键路径的一部分:

[logMuArray valueForKeyPath:@"@distinctUnionOfObjects.log_date"]

注意使用valueForKeyPath:,而不是valueForKey:,前者是Key-Value Coding协议中的一种方法,允许访问任意深度的属性。键路径是由点分隔键组成的NSString。每个key查找的结果依次用于访问下一个key(从原来的receiver开始);默认情况下,valueForKey: 在每一步都被简单地调用。

【讨论】:

  • 我可以将它与多个关键路径一起使用,例如 [log_currenttime,log_date]
【解决方案2】:

您应该将NSSet 用于 UNIQUE 项目,例如:

NSSet *filteredData = [NSSet setWithArray:[logMuArray valueForKey:@"log_date"]];

【讨论】:

  • 感谢 mogs :) 但以前 Jash Caswell 的分析器也不错且受欢迎..
【解决方案3】:

您可以为此使用KVC

[logMuArray valueForKey:@"@distinctUnionOfArrays.log_date"]

edit:编辑这个 wrt Josh 的回应

[logMuArray valueForKeyPath:@"@distinctUnionOfArrays.log_date"]

【讨论】:

  • [logMuArray valueForKeyPath:@"@ distinctUnionOfArrays.log_date"],用 valueForKeyPath 改变 valueForKey
【解决方案4】:

试试这个逻辑可能对你有帮助

-(NSMutableArray *) makeUnique :(NSMutableArray *) array {    
    int i;
    int count = [array count];
    for (i =0; i< count ; i++) {
        NSRange range = NSMakeRange (i+1, count); 
        [array removeObject:[array objectAtIndex:i] inRange:range];
    }
    return array;
}

【讨论】:

    【解决方案5】:

    你可以合并一个集合

    这是一些示例代码

    NSMutableArray * mArray = [NSMutableArray array];
    NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys:@"foo",@"bar",@"bar",@"oooo",nil];
    NSDictionary *d2 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil];
    NSDictionary *d3 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil];
    [mArray addObject:d1];
    [mArray addObject:d2];
    [mArray addObject:d3];
    NSLog(@"the array\n%@", mArray);
    NSLog(@"just bar %@", [mArray valueForKey:@"bar"]);
    //get unique values
    NSSet * set = [NSSet setWithArray:[mArray valueForKey:@"bar"]];
    NSLog(@"unique just bar %@", [set allObjects]);
    

    这是输出

    2011-12-20 01:50:59.034 TestEnvironment[32401:207] the array
    (
            {
            bar = foo;
            oooo = bar;
        },
            {
            bar = boo;
            oooo = bar;
        },
            {
            bar = boo;
            oooo = bar;
        }
    )
    2011-12-20 01:50:59.036 TestEnvironment[32401:207] just bar (
        foo,
        boo,
        boo
    )
    2011-12-20 01:50:59.038 TestEnvironment[32401:207] unique just bar (
        foo,
        boo
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2016-04-11
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多