На самом деле мне понравилась проблема, поэтому я реализовал полное решение в духе моего предыдущего ответа:
http://pastebin.com/6iazSKG9
Простое решение, не поточнобезопасное или что-то в этом роде, но, я думаю, веселое и хорошее начало.
Редактировать: некоторые уточнения, как требуется
См. Модульный тест для использования.
Существует два интерфейса: DataStructure<K,V>
и Query<V>
. DataStructure ведет себя в некоторой степени как карта (и в моей реализации она фактически работает с внутренней картой), но она также предоставляет повторно используемые и неизменяемые объекты запроса, которые можно комбинировать следующим образом:
Query<String> combinedQuery =
structure.and(
structure.or(
structure.search("blue"),
structure.search("red")
),
structure.not(
structure.search("green")
)
);
(Запрос, который ищет объекты, помеченные как (синий ИЛИ красный), а НЕ зеленый). Этот запрос можно использовать повторно, что означает, что его результаты будут меняться всякий раз, когда меняется фоновая карта (вроде интеллектуального плейлиста ITunes).
Объекты запросов уже поточнобезопасны, но карта поддержки - нет, поэтому здесь есть место для улучшения. Кроме того, запросы могут кэшировать свои результаты, но это, вероятно, будет означать, что интерфейс должен быть расширен для обеспечения метода очистки (вроде метода отсоединения в моделях Wicket), который не будет красивым.
Что касается лицензирования: если кто-нибудь захочет этот код, я буду рад поместить его в SourceForge и т. Д ...
Sean