Фильтрация - это один из способов сделать это, как описано в других ответах.
Фильтрация пока не масштабируема. На поверхности сложность времени будет выглядеть как O (n) (т.е. уже не масштабируется, если количество объектов в коллекции будет расти), но на самом деле из-за того, что один объект или более тесты должны применяться к каждому объекту в зависимости от запрос, сложность времени более точна - O (nt), где t - это количество испытаний, применяемых к каждому объекту.
Так производительность ухудшится по мере добавления дополнительных объектов в коллекцию, и/или по мере увеличения количества тестов в запросе.
Существует еще один способ сделать это, используя индексирование и теорию множеств.
Один подход заключается в построения индексов на полях в пределах объектов, хранящихся в вашей коллекции и которые вы затем проверить в вашем запросе.
Скажите, что у вас есть коллекция Car
объектов, и каждый Car
объект имеет поле color
. Скажем, ваш запрос эквивалентен «SELECT * FROM cars WHERE Car.color = 'blue'
». Вы можете создать индекс на Car.color
, который будет в основном выглядеть следующим образом:
'blue' -> {Car{name=blue_car_1, color='blue'}, Car{name=blue_car_2, color='blue'}}
'red' -> {Car{name=red_car_1, color='red'}, Car{name=red_car_2, color='red'}}
Затем данный запрос WHERE Car.color = 'blue'
, множество синих автомобилей могут быть получены в O() временная сложность. Если в вашем запросе были дополнительные тесты, вы могли бы затем проверить каждый автомобиль в этом кандидат, чтобы проверить, соответствует ли он оставшимся результатам в вашем запросе. Поскольку набор кандидатов, вероятно, будет значительно меньше, чем весь сбор, сложность времени составляет менее O (n) (в техническом смысле см. Комментарии ниже). Производительность не ухудшает столько же, когда к коллекции добавляются дополнительные объекты. Но это все еще не идеально, читайте дальше.
Другой подход, это то, что я хотел бы сослаться в качестве постоянный индекс запроса. Объяснение: с обычной итерацией и фильтрацией коллекция повторяется, и каждый объект проверяется, соответствует ли он запросу. Таким образом, фильтрация похожа на выполнение запроса по коллекции. Индекс постоянного запроса будет наоборот, когда коллекция вместо этого выполняется над запросом, но только один раз для каждого объекта в коллекции, даже если сбор может запрашиваться сколько угодно раз.
постоянного индекс запроса будет, как регистрация запроса с каким-то интеллигентных коллекциями, так что, как объекты добавляются и удаляются из коллекции, коллекция будет автоматически проверять каждый объект против все положения запросы, которые были зарегистрированы с ним. Если объект совпадает с постоянным запросом, коллекция может добавлять/удалять его в/из набора, предназначенного для хранения объектов, соответствующих этому запросу. Впоследствии объекты, соответствующие любому зарегистрированному запросу, могут быть получены в O() сложности времени.
Информация, указанная выше, взята с CQEngine (Collection Query Engine). Это в основном механизм запросов NoSQL для извлечения объектов из коллекций Java с использованием запросов, подобных SQL, без накладных расходов на итерацию через коллекцию. Он построен вокруг идей выше, плюс еще несколько. Отказ от ответственности: Я автор. Это с открытым исходным кодом и в центральном центре. Если вам будет удобно, пожалуйста, поддержите этот ответ!
Это переводчик xpath? – 2013-04-29 09:33:20
это интерпретатор выражения XPath – 2013-04-30 18:01:38