Iphone 如何知道NSMutableArray是否包含对象?
我有一个NSMutableArray路径,其中包含许多路径对象 我会知道路径中是否有特定路径 我试过:Iphone 如何知道NSMutableArray是否包含对象?,iphone,nsmutablearray,nspredicate,Iphone,Nsmutablearray,Nspredicate,我有一个NSMutableArray路径,其中包含许多路径对象 我会知道路径中是否有特定路径 我试过: if([paths containsObject:aPath]) { return YES; } 但它不起作用 因此,我也尝试使用谓词: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", path]; NSArray *filteredArray = [self.paths f
if([paths containsObject:aPath]) {
return YES;
}
但它不起作用
因此,我也尝试使用谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", path];
NSArray *filteredArray = [self.paths filteredArrayUsingPredicate:predicate];
但我有一个错误,控制台告诉我路径不是集合
编辑:
我的路径数组是:
2013-04-04 20:57:36.465 numbs[42781:617] paths (
"PATH: (\n 2,\n 2,\n 2,\n 5,\n 5,\n 6,\n 5,\n 4\n)",
"PATH: (\n 2,\n 2,\n 2,\n 5,\n 5,\n 6,\n 4,\n 5\n)",
"PATH: (\n 2,\n 2,\n 2,\n 5,\n 5,\n 4,\n 5,\n 6\n)",
"PATH: (\n 2,\n 2,\n 2,\n 5,\n 5,\n 4,\n 6,\n 5\n)"
)
路径是:
PATH: (
2,
2,
2,
5,
5,
5,
6,
5,
4
)
编辑2:
我添加了Path.m
- (BOOL)isEqual:(id)other
{
return ([other isKindOfClass:[Path class]] &&
[[other arrayOfNode] isEqual:self.arrayOfNode] &&
[other somme] == self.somme &&
[[other result] isEqual:self.result] &&
[[other resultString] isEqual:self.resultString] &&
[[other wayArray] isEqual:self.wayArray]);
}
- (NSUInteger) hash;
{
return somme ^ [resultString hash] ^ [wayArray hash] ^ [arrayOfNode hash] ^ [result hash];
}
在我的控制器中:
if([paths containsObject:aPath]) {
return YES;
}
但是这种方法也不起作用。编辑了(有关04013上帖子中的新信息)
如果我是你,我会试试这样的:
Path *_path = ...; // you object you'd like to find
NSArray *_pathsArray = ...; // the array with lots of Path objects;
if ([[_pathsArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return ([evaluatedObject isEqual:_path]); // ... or whatever how you'd like to compare them
}]] count] > 0) {
// it contains your _path object
} else {
// it doesn't contain you _path object
}
或
Path *_path = ...; // you object you'd like to find
NSArray *_pathsArray = ...; // the array with lots of Path objects;
__block BOOL _isInsideTheArray = FALSE;
[_pathsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
*stop = _isInsideTheArray = ([obj isEqual:_path]); // ... or whatever how you'd like to compare them
}];
if (_isInsideTheArray) {
// it contains your _path object
} else {
// it doesn't contain you _path object
}
containsObject:
if([paths containsObject:aPath]) {
return YES;
}
isEqual:
。我不知道路径属性,所以您需要比较路径包含的任何实例变量
- (BOOL)isEqual:(id)other
{
return ([other isKindOfClass:[Path class]] &&
// TODO: instance variable checks like...
// [[other ivar] isEqual:_ivar] &&
// [[other ivar2] isEqual:_ivar2]
}
isEqual:
,您还必须实现hash
- (NSUInteger)hash
{
return [_ivar hash] ^ [_ivar2 hash];
}
有关更多信息,请参见尝试使用块定义谓词。这可能会有帮助。什么是路径对象?它是一个新的XPath吗?你最初的想法在我看来是正确的,这取决于aPath如何实现isEqual:不,你的两个解决方案对我不起作用。我用我的数据编辑帖子。比较数组项的规则是什么?我只比较了指针,因为条件没有很好地定义;这就是我评论相关行的原因。你必须用正确的比较代码替换这些行。我用你的建议编辑我的帖子。我错过什么了吗?因为它不起作用。请尝试与
isEqualToArray:
,isEqualToDictionary:
进行比较,如果它们是数组,则为字典。。。如果您在isEqual:
方法中记录属性以查看哪些属性没有返回true,也会有所帮助