用JAVA将if-else语句隐藏到hasmap中



我想在java中实现一个函数,该函数可以获取字符串输入并对其进行处理

class Main {
static String string_process(String s_in) {
String s_out;
if(s_in.contains("USA")){
s_out = "english";
}
else if(s_in.contains("Germany")){
s_out = "dutch";
}
else if(s_in.contains("Brazil")){
s_out = "Portuguese";
}
else {
s_out = "Uknown";
}
return s_out;
}
public static void main(String[] args) {
String process = string_process("I am from USA!");
System.out.println("I understand "+process);
}
}

我想知道我是否可以实现它的hashmap。就复杂性而言,这样做有什么好处吗?

其优点是处理案例和添加新案例所需的代码更少。

这就是地图的样子:

class Main {
static Map<String, String> countryToLanguageMap = Map.of(
"USA", "english",
"Germany", "dutch",
"Brazil", "Portuguese"
);
static String string_process(String s_in) {
for (Map.Entry<String, String> entry : countryToLanguageMap.entrySet()) {
if(s_in.contains(entry.getKey())){
return entry.getValue();
}
}
return "Unknown";
}
public static void main(String[] args) {
String process = string_process("I am from USA!");
System.out.println("I understand "+process);
}
}

例如,假设您想添加一个新案例;UK";用";英语";。这是你必须添加的基于地图的版本:

...
"UK", "english",
...

而原始版本:

...
else if(s_in.contains("UK")){
s_out = "english";
}
...

简而言之,它会使代码更可读,但运行时的复杂性不会显著改变。与其他答案一样,您需要创建一个全局哈希映射变量来保存键值对。

这里有一个使用Stream API和静态Map的可能解决方案。

注意:string_process()这样的名称与Java命名约定不一致,也没有向读者提供太多关于其用途的信息

基本上,解决方案可以归结为filter()+findFirst()方法的组合,从而生成Optianal。如果optional为空,则会提供默认值"Unknown"

private static final Map<String, String> COUNTRY_BY_LANGUAGE =
Map.of("USA", "English", "Germany", "German", "Brazil", "Portuguese");
public static String processCountry(String from) {

return COUNTRY_BY_LANGUAGE.entrySet().stream()
.filter(entry -> entry.getKey().contains(from))
.findFirst()
.map(Map.Entry::getValue)
.orElse("Unknown");
}

没有复杂算法的简单暴力解决方案是:

  • 构建您的HashMap
  • 如果索引>=,则使用字符串检查的"indexOf"方法循环hashMap中的键0这将是n*k的时间复杂性(n-关键字计数,k-平均输入字符串长度(
public class Solution {
private static final Map<String, String> COUNTRY_TO_LANGUAGE = Map.of(
"USA", "English",
"Germany", "Deutsch", 
"Brazil", "Portuguese");
private static final String UNKNOWN = "Unknown";
public static String find(String greeting) {
for(String key: COUNTRY_TO_LANGUAGE.keySet()) {
if (greeting.indexOf(key) >= 0) return COUNTRY_TO_LANGUAGE.get(key);
}
return UNKNOWN;
}
public static void main(String[] args) {
String greeting = "I am from USA!";
System.out.println("I understand " + find(greeting));
}
}

因此,与其添加新的if-else块,不如更新地图。

最新更新