Я не уверен, могу ли я задать здесь такие вопросы. Извиняется, если это неправильный вопрос.Как реализовать логику, которая включает в себя множество критериев поиска
У нас есть функция, которая ищет некоторые элементы на основе пользовательского ввода. Проблема заключается в том, что пользователь может вводить несколько критериев. Возможные комбинации
- Имя: некоторое имя
- Типа: некоторый тип
- домен: некоторая область
- имени: некоторое имя [& | ] домен: некоторая область
- имя: некоторые имя [& | ] тип: некоторые тип
- type: некоторый тип [& | ] домен: некоторая область
- имя: некоторые имя [& | ] 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. Проблема в регулярных выражениях занимает больше времени, когда я где-то читаю. Я не могу принять решение, или я не уверен, есть ли еще лучший подход.
Может кто-нибудь предложить простое решение? Спасибо всем заранее.