【问题标题】:Checking If One Array Contains An Object of Another Array In Objective C在Objective C中检查一个数组是否包含另一个数组的对象
【发布时间】:2015-06-15 12:07:11
【问题描述】:

我正在使用以下函数来检查数组中的对象是否存在于另一个数组中。如果对象不存在,那么我会将该对象添加到新数组中,否则该对象将不会包含在我实例化的新数组中。

+ (NSMutableArray *)loadUngroupedSpeakerList
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSMutableArray *speakerList = [[NSMutableArray alloc] init];
    NSArray *speakerIDList = [userDefaults objectForKey:DATA_SPEAKER_IDLIST];
    NSArray *speakerIDListGrouped = [userDefaults objectForKey:DATA_SPEAKER_IDLIST_GROUPED];

    //**** this is for checking the contents of speakerIDListGrouped ****//
    for(NSString *speakerID in speakerIDListGrouped)
    {
        NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList check content:%@", speakerID);
    }

    for(NSString *speakerID in speakerIDList)
    {
        if(![speakerIDListGrouped containsObject:speakerID])
        {
            NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList: speakerID: %@", speakerID);

            NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];

            [speakerList addObject:speakerDict];
        }
    }

    return speakerList;
}

在上面的代码中,speakerList 包含所有的speakerID。而 speakerIDListGrouped 仅包含组中使用的扬声器 ID。我的函数需要消除组中使用的所有扬声器 ID,所以我按照上面代码的方式完成了。

我的问题: 当我运行代码时,我注意到即使 speakerIDListGrouped 包含 speakerIDList 中的对象,这两行仍然会被执行

NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];

[speakerList addObject:speakerDict];

据我了解,这不应该发生。因为我只允许在 speakerIDList 不包含该对象时执行它们。

这是我执行代码时的日志:

2015-06-15 19:31:24.849 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:72243140485836704
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:7782687177520836128
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 72243140485836704
2015-06-15 19:31:24.851 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 7782687177520836128

可以看出,speakerIDListGrouped 确实包含这两个对象。但是,当我尝试通过将下部 for 循环内的字符串硬编码为我在 Log 上打印的对象之一(即 72243140485836704)来替换字符串时。该函数现在可以正常工作,我的意思是它没有执行我之前显示的两行。

我现在很困惑。我硬编码的字符串和从数组中获得的字符串有什么区别?内容是一样的。

非常感谢!

【问题讨论】:

  • 似乎您想知道NSDictionary 中的NSString 是否存在于NSArray 中,而containsObject: 则不存在。您可以使用valueForKeyPath:,例如给您一个speakerIDNSArray,然后检查它是否在里面。
  • 听起来你想使用NSSet
  • 打印speakerIDListGroupedspeakerIDList 的内容,同时打印它们包含的每个对象的类 - 是否都匹配?
  • 嗨@Larme,嗯,不,speakerIDList 和speakerIDListGrouped 包含NSStrings。只有输出数组包含 NSDictionary。
  • @Droppy 我会试试的。谢谢!

标签: ios objective-c arrays


【解决方案1】:

我做了同样的事情它工作正常......

NSMutableArray *speakerList = [[NSMutableArray alloc] init];
NSArray *speakerIDList = @[@"a",@"b",@"c",@"d",@"e"];
NSArray *speakerIDListGrouped =@[@"a",@"b",@"f",@"g",@"h"];
for(NSString *speakerID in speakerIDListGrouped)
{
    NSLog(@"%@", speakerID);
}

for(NSString *speakerID in speakerIDList)
{
    if(![speakerIDListGrouped containsObject:speakerID])
    {
        NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList: speakerID: %@", speakerID);



        [speakerList addObject:speakerID];
    }
}

数组中的对象可能有问题......

【讨论】:

  • 很长一段时间以来,我注意到导致这个问题的是我的严重错误。当我将数据存储在 NSUserDefaults 中时,它是 NSNumber,这就是我的代码不起作用的原因。 @Akshay Agrawal 是对的。我的数组中的对象确实存在问题。
【解决方案2】:

这个答案将帮助其他人。很简单,使用下面的NSArray方法

id commonObject = [array1 firstObjectCommonWithArray:array2];

参考:https://developer.apple.com/documentation/foundation/nsarray/1408825-firstobjectcommonwitharray?language=objc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 2015-10-28
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多