gpt4 book ai didi

java - 当 HashMap 值第一次出现时,我怎么会出现 'break' 呢?

转载 作者:行者123 更新时间:2023-12-02 00:13:25 26 4
gpt4 key购买 nike

下面您可以看到我的代码片段,我在其中尝试识别给定电话号码的原籍国。问题是它总是返回比较字符串值的最后一个键。

我已按降序顺序对 HashMap 进行排序,然后使用 startWith 方法将给定的字符串与 HashMap 中的每个值进行比较。

import java.util.Comparator;
import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.swing.JOptionPane;

public class CountryFinder {

static Map<String, String> countriesNamesAndCodes;

public static void main(String[] args) {

countriesNamesAndCodes = new HashMap<>();
countriesNamesAndCodes.put("Greece", "30");
countriesNamesAndCodes.put("Italy", "39");
countriesNamesAndCodes.put("Germany", "49");
countriesNamesAndCodes.put("USA", "1");
countriesNamesAndCodes.put("UK", "44");
countriesNamesAndCodes.put("Bahamas", "1-242");
countriesNamesAndCodes.put("ExampleCountry", "301");

for (Entry<String, String> entry : countriesNamesAndCodes.entrySet()) {
if (entry.getValue().contains("-")) {
String tempValue = entry.getValue().replaceAll("-", "");
entry.setValue(tempValue);
}
}

countriesNamesAndCodes.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEach(System.out::println);

String input = String.valueOf(JOptionPane.showInputDialog("Type a telephone number"));
System.out.println(input);
System.out.println("Origin Country: " + getCountry(input));

}

private static String getCountry(String telephoneNumber) {
for (Entry<String, String> entry : countriesNamesAndCodes.entrySet()){
if (telephoneNumber.startsWith(entry.getValue())) {
return (entry.getKey());
}
}
return null;
}
}

当输入为 1242888999 或 1-242888999 时,我期望输出为“Bahamas”,但实际输出为“USA”。输入 301555666 也是如此,我希望“ExampleCountry”而不是“Greece”。

最佳答案

HashMap 未排序。您不能依赖它的顺序,因为它主要基于 hashCode()

但是您的问题与顺序无关,这是因为您没有选择最长的前缀(长度最高的值):如果您查找 1-242,则美国 (1) 和巴哈马 (1-242) )有效。示例国家 (301) 和希腊 (30) 也是如此。

您的算法应该是这样的:对于电话号码以条目值开头的每个条目,我们会记住“最佳匹配”条目,并在从未找到它(初始情况)或其值是时更新它比之前匹配的要大。

private static String getCountry(String telephoneNumber) {
var bestMatch = null; // Map.Entry<String,String>
for (Entry<String, String> entry : countriesNamesAndCodes.entrySet()){
if (telephoneNumber.startsWith(entry.getValue()) {
if (bestMatch == null || entry.getValue().length() > bestMatch.getValue().length()) {
bestMatch = entry;
}
}
}
return null != bestMatch ? bestMatch.getKey():null;
}

关于java - 当 HashMap 值第一次出现时,我怎么会出现 'break' 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com