Переройте NSArray для строки

Я не вижу проблемы с простым решением: Таблица для объектов, таблица для тегов, кросс-таблица для "меток"

Индексы на кросс-таблице должны быть достаточной оптимизацией. Выбор соответствующих объектов был бы

SELECT * FROM items WHERE id IN  
    (SELECT DISTINCT item_id FROM item_tag WHERE  
    tag_id = tag1 OR tag_id = tag2 OR ...)  

, И метки будут

SELECT * FROM items WHERE  
    EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag1)  
    AND EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag2)  
    AND ...

, который является по общему признанию, не настолько эффективен для большого количества сравнения тегов. Если необходимо поддержать количество тега в памяти, Вы могли бы сделать запрос для запуска с тегов, которые являются не часто, таким образом, И последовательность был бы оценен более быстрый. В зависимости от ожидаемого количества тегов, которые будут согласованы против и предвкушение соответствия любому синглу их, это могло быть решением для OK, если необходимо соответствовать 20 тегам и ожидать, что некоторый случайный объект будет соответствовать 15 из них, тогда это все еще было бы тяжело на базе данных.

19
задан Matt S. 14 September 2011 в 17:25
поделиться

2 ответа

Не тестировалось, поэтому может быть синтаксическая ошибка, но вы поймете идею.

NSArray* inputArray = [NSArray arrayWithObjects:@"dog", @"cat", @"fat dog", @"thing", @"another thing", @"heck here's another thing", nil];

NSMutableArray* containsAnother = [NSMutableArray array];
NSMutableArray* doesntContainAnother = [NSMutableArray array];

for (NSString* item in inputArray)
{
  if ([item rangeOfString:@"another"].location != NSNotFound)
    [containsAnother addObject:item];
  else
    [doesntContainAnother addObject:item];
}
37
ответ дан 30 November 2019 в 01:50
поделиться

Если известно, что строки внутри массива различны, вы можете использовать наборы. NSSet быстрее NSArray на больших входных данных:

NSArray * inputArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"one again", nil];

NSMutableSet * matches = [NSMutableSet setWithArray:inputArray];
[matches filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] 'one'"]];

NSMutableSet * notmatches = [NSMutableSet setWithArray:inputArray];
[notmatches  minusSet:matches];
47
ответ дан 30 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: