【问题标题】:How to check my nsarray contains another nsarray element or not in fastest way IOS如何以最快的方式检查我的 nsarray 是否包含另一个 nsarray 元素 IOS
【发布时间】:2021-03-22 15:01:16
【问题描述】:

我看过很多答案,但没有得到我的答案。所以这就是为什么我决定发布一个问题。如果有人能找到有用的链接或答案将很有帮助。 这是我的字典数组:

<__NSArrayM 0x283ba04e0>(
{
    failvalues =     (
        "Check 1"
    );
    fieldname = "Check 3";
    fieldvalue =     (
        "Check 1",
        "Check 2"
    );
    showtype = mandatory;
    tagvalue = 0;
},
{
    failvalues =     (
        Fail
    );
    fieldname = "Dropdown 3";
    fieldvalue =     (
        Fail
    );
    showtype = mandatory;
    tagvalue = 1;
},
{
    failvalues =     (
        "Check 1",
        "Check 4"
    );
    fieldname = "Check 4";
    fieldvalue =     (
        "Check 1",
        "Check 2"
    );
    showtype = mandatory;
    tagvalue = 2;
})  

所以我想检查字段值是否包含失败值。 以下是我尝试过但似乎不起作用的代码:

for (int i = 0; i< [arrFields count]; i++) {
            if ([[[arrFields objectAtIndex:i]objectForKey:@"failvalues"] isKindOfClass:[NSArray class]]) {
                if (![[[[arrFields objectAtIndex:i] objectForKey:@"failvalues"] objectAtIndex:0] isEqualToString:@""]) {
                    NSLog(@"Field Values %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                   NSArray *failValues = [[arrFields objectAtIndex:i] objectForKey:@"failvalues"];
                    for (int j = 0; j < [failValues count]; j++) {
                        if ([failValues containsObject:[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]]) {
                            NSLog(@"Contains %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                        } else {
                            NSLog(@"No fail values");
                        }
                    }
                } else {
                    NSLog(@"No Fail Fields");
                }
            } else {
                NSLog(@"Not an array");
            }
        }  

编辑:
这个我试过了,但是如何打破这两个循环

for (int i = 0; i< [arrFields count]; i++) {
            NSArray *fieldValues = [[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"];
            NSArray *failValues = [[arrFields objectAtIndex:i] objectForKey:@"failvalues"];
                if (![[[[arrFields objectAtIndex:i] objectForKey:@"failvalues"] objectAtIndex:0] isEqualToString:@""]) {
                    //NSLog(@"Field Values %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                    for(NSString *value in fieldValues){
                        if ([failValues containsObject:value]) {
                            NSLog(@"Contains %@",value);
                            scanStatus = TRUE;
                            return;
                        }
                    }
                } else {
                    NSLog(@"No Fail Fields");
                }
        }

提前致谢!

【问题讨论】:

  • 你到底想要什么? True/false 如果有任何失败的值?所有失败值的列表?只有failValues 有对应的fieldValue?
  • 如果它包含,那么我想设置一个布尔值 true 并打破两个循环
  • 请检查我更新的问题。谢谢!

标签: ios objective-c xcode nsarray


【解决方案1】:

对于令人恐惧的goto,这是一个经典的用例。众所周知,goto 可以创建灾难性的混乱代码,但在这种情况下,它会让事情变得更干净。您必须知道何时使用 goto,并且一定要谨慎使用它。但这是我编写代码的方式:

    BOOL found = NO;
    for (NSDictionary *dict in arrFields)
    {
        NSArray *fieldValues = dict[@"fieldvalue"];
        NSArray *failValues = dict[@"failvalues"];
        if (![failValues[0] isEqualToString:@""]) {
            for (NSString *value in fieldValue) {
                if ([failValues containsObject:value]) {
                    NSLog(@"Contains %@",value);
                    found = YES;
                    goto leaveLoops;
                }
            }
        }
    }
leaveLoops:
    if (found) NSLog(@"Found one.");
    else NSLog(@"Didn't find one.");

如果你不能让自己使用 goto(你不会孤单),这里有一个 gotoless 替代方案:

    BOOL found = NO;
    for (NSDictionary *dict in arrFields)
    {
        NSArray *fieldValues = dict[@"fieldvalue"];
        NSArray *failValues = dict[@"failvalues"];
        if (![failValues[0] isEqualToString:@""]) {
            for (NSString *value in fieldValue) {
                if ([failValues containsObject:value]) {
                    NSLog(@"Contains %@",value);
                    found = YES;
                    break;
                }
            }
            if (found) break;
        }
    }
    
    if (found) NSLog(@"Found one.");
    else NSLog(@"Didn't find one.");

【讨论】:

  • 嗨@TyR 你更喜欢哪一个?我的意思是为了性能?
  • 感谢 TyR 的帮助。我认为 goto 在我的场景中更可取:)
  • 性能方面,两者之间不会有任何实际差异。 (编译后的 goto 可能会快一两条指令。)
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多