【问题标题】:NSMutableArray containsObject questionNSMutableArray containsObject 问题
【发布时间】:2010-11-03 17:39:12
【问题描述】:

我正在尝试比较两个数组,比如数组 a 是一系列数组,如下所示:

((1,1), (1,2), (1,3), (1,4), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)) 

数组 b 是一系列数组,如下所示:

((1,1), (1,2), (1,3), (1,4), (2,1), (2,2), (2,3))

如何检查数组 a 中的项目是否不在数组 b 中

for(NSString* itemFromA in a) {
 if ([b containsObject: itemFromA] == FALSE) { 
   NSLog(@"ok");
   break;
 }
}

这似乎对我不起作用。

【问题讨论】:

  • 请注意正确格式化您的问题(格式化您的代码以便阅读)。此外,不清楚您在问什么,因为您的描述与您的代码不太匹配。您的 for 循环使它看起来像您的数组 A 和 B 包含 NSString 实例,但您的描述表明每个都是未知的数组数组(字符串?数字?包含 NSRange 结构的 NSValue?)。请说明确切的结构。
  • 你不应该永远比较false。始终使用! ![b containsObject:itemFromA]。在与 false 比较的情况下,它没有区别。你不允许做的事情,是比较true。顺便说一句:在 Objective-C 中,使用 YESNO 而不是 truefalse
  • @Georg:虽然我同意你对 BOOL 的 YES/NO 的看法,但 if ([b containsObject:itemFromA] == NO) 是完全有效的。 -containsObject: 返回一个 BOOL,所以就像说 BOOL isThere = YES; if (isThere == NO)... 与 if (!isThere) 相同。
  • 数组中有哪些对象?自定义对象?
  • 简单地说,在 Pruitlgoe 阐明确切的数据结构之前,这个问题无法得到任何肯定的回答。

标签: objective-c cocoa nsmutablearray


【解决方案1】:

我不确定迭代器类型是否正确;听起来ba 是数组的数组,但您使用NSString* 作为迭代器类型。我不是 Objective-C 内部的高手,但我相信这会导致您的检查失败(因为 itemFromA 的类型将是 NSString* 并且您正在遍历 NSArray*s 的集合。)

另外containsObject: 可能没有做你想做的事,即它使用isEqual 来执行比较。文档中提到isEqual 专门用于NSArray,但我找不到有关该专业化的详细信息。我不知道containsObject: 在这些“深度”比较操作中的表现如何。

【讨论】:

  • 由于 Objective-C 的动态特性,即使指定了错误的数据类型,代码也会调用正确的方法。
  • 我认为这在运行时并不重要,因为 NSArray 和 NSString 都是 NSObject 的子类,它拥有相等和哈希方法。由于数组中的任何内容都会用自己的实现来回答这些问题,因此无论您为保存指针提供什么类,它们的行为都是相同的。问题是我们不知道基于问题/代码的确切结构是什么。这很重要,因为例如 NSArray 的 -isEqual: 依赖于与 NSString 不同的标准。
  • 确实,指针的静态类型并不能确定将使用什么实际方法实现——这将在运行时由实例的动态类型确定。
【解决方案2】:

我解决了这个问题,但请随时清理它。

@implementation AppController - (IBAction)GetArrayData:(id)sender {

int a=10;
int b=10;
int c=20;
int d=20;
int row=0;
int col=0;

NSMutableArray* e = [[NSMutableArray alloc] init];
NSMutableArray* f = [[NSMutableArray alloc] init];

for(row=0; row<a; row++) {
    for(col=0; col<b; col++) {
        NSNumber* thisrow = [NSNumber numberWithInt:row];
        NSNumber* thiscol = [NSNumber numberWithInt:col];
        [e addObject:[NSArray arrayWithObjects:thisrow, thiscol, nil]];
    }
}

for(row=0; row<c; row++) {
    for(col=0; col<d; col++) {
        NSNumber* thisrow = [NSNumber numberWithInt:row];
        NSNumber* thiscol = [NSNumber numberWithInt:col];
        [f addObject:[NSArray arrayWithObjects:thisrow, thiscol, nil]];

    }
}

//check to see if f contains items from e
for(NSString* thisset in f) {
    if ([e containsObject: thisset]) {
        NSLog(@"This set (%@) is already being used.", thisset);
    } else {
        NSLog(@"We can start the ad at these coordinates: %@", thisset);
        break;
    }
}

[e 释放]; [f 释放]; } @结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多