我不确定我是否可以在这里问这样的问题。如果这是一个不恰当的问题,请道歉。
我们有一个功能可以根据用户输入搜索一些项目。问题是用户可以输入多个标准。可能的组合是
- 名称:一些名字
- 类型:某种类型
- 域:某个域
- 名称:某个名称 [ & | ] 域:一些域
- 名称:某个名称 [ & | ] 类型:某种类型
- 类型:某些类型 [ & | ] 域:一些域
- 名称:某个名称 [ & | ] 类型:一些类型 [ & | ] 域:一些域
“域”和“类型”是 X 类型的属性,“名称”是 Y 类型的属性。
我已经实现了不同的方法,这些方法实际上检索了不同组合的所有数据。基本方法是
Set<Item> getItemsForAName(String name)
Set<Item> getItemsForADomain(String domain)
Set<Item> getItemsForAType(String type)
其他方法将在内部使用这 3 个方法并返回结果。
我现在面临的问题是我必须编写一些逻辑,这些逻辑实际上会根据搜索字符串调用适当的方法。
经过各种逻辑最终我决定使用正则表达式。所以我写了一些这样的 if else 语句
//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 else 语句
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 的方式。问题是正则表达式需要更多时间我在某处阅读。我无法做出决定,或者我不确定是否有更好的方法。
谁能建议一个简单的解决方案?谢谢大家。