2013-04-04 2 views
1

У меня есть NSMutableArray Paths, который содержит много объектов Path.Как узнать, содержит ли NSMutableArray объект?

Я бы знал, если определенный путь находится в Пути.

Я попытался с:

if([paths containsObject:aPath]) { 
    return YES; 
} 

, но он не работает.

Итак, я попытался также с Предикатами:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", path]; 
NSArray *filteredArray = [self.paths filteredArrayUsingPredicate:predicate]; 

Но у меня есть ошибка, консольный сказать мне, что Дорожки не коллекция.

EDIT:

Мой массив трактов:

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 
) 

EDIT 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; 
    } 

Но этот метод не работает тоже.

+0

попытаться определить предикат с блоками. это может помочь. – holex

+2

Что такое объект Path? это NSIndexPath? ваша оригинальная идея выглядит правильно для меня, в зависимости от того, как aPath реализует isEqual: – danh

ответ

0

EDITED(для новой информации в сообщении на 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 
} 
+0

Нет, ваши 2 решения не работают для меня. Я редактирую свой пост с моими данными. – cmii

+0

Каково правило для сравнения элементов массива? Я сравнивал указатель только потому, что условия не были определены хорошо; ** Именно по этой причине я прокомментировал соответствующие строки **. вы должны заменить эти строки правильным кодом сравнения. – holex

2
  1. Ваш первый инстинкт является правильным, используйте containsObject:

    if([paths containsObject:aPath]) { 
        return YES; 
    } 
    
  2. Но это не работает для вас, потому что вы используете пользовательский подкласс и не реализованы (я предполагаю) isEqual: , Я не знаю свойств пути, поэтому вы можете сравнить любые пути переменных экземпляра.

    - (BOOL)isEqual:(id)other 
    { 
        return ([other isKindOfClass:[Path class]] && 
         // TODO: instance variable checks like... 
         // [[other ivar] isEqual:_ivar] && 
         // [[other ivar2] isEqual:_ivar2]     
    } 
    
  3. Наконец, согласно документации, если вы реализуете isEqual: вы также должны реализовать hash

    - (NSUInteger)hash 
    { 
        return [_ivar hash]^[_ivar2 hash]; 
    } 
    

Для получения дополнительной информации см Implementing Equality and Hashing

+0

Equals переименованы в isEqual –

+0

Я редактирую свой пост с вашим советом. Я что-то пропустил? потому что он не работает. – cmii

+0

Попробуйте сравнить с 'isEqualToArray:', 'isEqualToDictionary:' если они являются массивами, словарями ... Также поможет, если вы зарегистрируете свойства в методе 'isEqual:', чтобы увидеть, что не возвращает true –

Смежные вопросы