2013-10-08 4 views
1

Я не уверен, могу ли я задать здесь такие вопросы. Извиняется, если это неправильный вопрос.Как реализовать логику, которая включает в себя множество критериев поиска

У нас есть функция, которая ищет некоторые элементы на основе пользовательского ввода. Проблема заключается в том, что пользователь может вводить несколько критериев. Возможные комбинации

  1. Имя: некоторое имя
  2. Типа: некоторый тип
  3. домен: некоторая область
  4. имени: некоторое имя [& | ] домен: некоторая область
  5. имя: некоторые имя [& | ] тип: некоторые тип
  6. type: некоторый тип [& | ] домен: некоторая область
  7. имя: некоторые имя [& | ] type: некоторый тип [& | ] Домен: некоторая область

«домен» и «тип» являются атрибутами типа X и «имени» является атрибутом типа Y.

Я реализовал различные методы, которые на самом деле получают все данные для различные комбинации. Основные методы:

Set<Item> getItemsForAName(String name) 
Set<Item> getItemsForADomain(String domain) 
Set<Item> getItemsForAType(String type) 

Другие методы будут использовать эти 3 метода внутри страны и вернут результат.

Проблема, с которой я столкнулась, теперь мне нужно написать некоторую логику, которая на самом деле вызовет соответствующий метод на основе строки поиска.

После различных логик, наконец, я решил использовать регулярные выражения. Поэтому я написал некоторые, если еще такие заявления, как это

//I have the search string separated and put in a map already 
if(searchString.matches("name:[\\w\\s-]+")) { 
    Set<item> items = getItemsForAName(map.get("name")); 
} else if (searchString.matches("type:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForAType(map.get("type")); 
} else if (searchString.matches("domain:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForAType(map.get("domain")); 
} else if (searchString.matches("domain:[\\w\\s-]+&type:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainAndType(map.get("domain"), map.get("type")); 
} else if (searchString.matches("domain:[\\w\\s-]+&name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainAndName(map.get("domain"), map.get("name")); 
} else if (searchString.matches("type:[\\w\\s-]+&name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForATypeAndName(map.get("type"), map.get("name")); 
} else if (searchString.matches("domain:[\\w\\s-]+\\|type:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainOrType(map.get("domain"), map.get("type")); 
} else if (searchString.matches("domain:[\\w\\s-]+\\|name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainOrName(map.get("domain"), map.get("name")); 
} else if (searchString.matches("type:[\\w\\s-]+\\|name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForATypeOrName(map.get("type"), map.get("name")); 
} else if (searchString.matches("domain:[\\w\\s-]+&type:[\\w\\s-]+&name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainAndTypeAndName(map.get("domain"), map.get("type"), map.get("name")); 
} else if (searchString.matches("domain:[\\w\\s-]+\\|type:[\\w\\s-]+\\|name:[\\w\\s-]+")) { 
    Set<Item> items = getItemsForADomainOrTypeOrName(map.get("domain"), map.get("type"), map.get("name")); 
} 

Я полагаю, что это глупая логика. Я даже пробовал другие способы нарушить эту логику. Другая логика, которую я написал, - это при построении карты, где я храню разделители. Я использую LinkedHashMap для этого, потому что мне нужен порядок вставки, чтобы сделать его немного простым. Тогда я пишу некоторые, если другое заявление как этого

if(!map.get("name").isEmpty() && !map.get("type").isEmpty() && map.get("domain").isEmpty() && !map.get("separator1").equals("&") && map.get("separator2").equals("&")) { 
    Set<Item> items = getItemsForADomainAndTypeAndName(map.get("domain"), ap.get("type"), map.get("name")); 
} else if ..... 

Однако я вмятину выбрать вторую процедуру, потому что мне нужна порядок вставки Я использую LinkedHashMap так может стать проблемой в будущем, и мне нужно даже поставить разделители в карта. Поэтому я решил пойти с RegEx. Проблема в регулярных выражениях занимает больше времени, когда я где-то читаю. Я не могу принять решение, или я не уверен, есть ли еще лучший подход.

Может кто-нибудь предложить простое решение? Спасибо всем заранее.

ответ

0

Возможно, попробуйте использовать перегруженную функцию поиска (если ваш язык поддерживает это), которая вызовет соответствующую функцию, основанную на лестнице if/else, которая проверяет, не являются ли определенные значения не равными нулю.

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