我正在创建一个程序,在其中我从.txt文件中读取50个州及其大写字母。然后,我运行while循环,并将每个状态存储在ArrayList中,并将每个大写字母存储在另一个ArrayList中。我将这两个ArrayList转换为常规数组,然后运行for循环以将每个状态存储为映射中的键,并将每个大写形式存储为映射中的值。我的问题是,当我使用map.get()方法返回特定状态的大写字母时,它只是返回“ null”,我不确定为什么会这样。这是我的代码:
import java.util.*;
import java.io.File;
import java.io.FileNotFoundException;
public class ChapterOneBasics {
public static void main(String[] args) throws FileNotFoundException {
Map<String, String> usCapitals = new HashMap<String, String>();
ArrayList<String> aList = new ArrayList<>();
ArrayList<String> bList = new ArrayList<>();
int x = 0;
File file = new File("C:\\Private\\Private\\Private\\capitals.txt");
Scanner sc = new Scanner(file);
while(sc.hasNextLine()) {
if(x % 2 == 0) {
aList.add(sc.nextLine());
}
else
bList.add(sc.nextLine());
x++;
}
String[] usStates = aList.toArray(new String[aList.size()]);
String[] uSCapitals = bList.toArray(new String[bList.size()]);
for(int y = 0; y < uSCapitals.length; y++) {
usCapitals.put(usStates[y], uSCapitals[y]);
}
System.out.println(usCapitals.get("Montana"));
}
}
如您所见,我已将每个州以字符串格式存储到Map中,但是每当我调用州来查询首都时,我都会将其作为输出:
null
我不确定是什么问题。
答案 0 :(得分:1)
您的问题出在for循环中,您想在其中将州和大写字母放在地图中:
usCapitals.put(usStates[y], uSCapitals[y]);
您有两个选择:
您要么更改尝试从地图中获取值的方式,要么执行get("Montana")
如果要执行get("MT")
,则希望翻转键和值的顺序,以使其成为可能。
然后将地图更改为此:
get("Montana")
答案 1 :(得分:1)
应该完成上述对空白的修剪。 那么结果将是:
Map<String, String> usCapitals = new HashMap<>();
Path file = Paths.get("C:\\Private\\Private\\Private\\capitals.txt");
List<String> lines = Files.readAllLines(path, Charset.defaultCharset());
for (int i = 0; i < lines.size() - 1; i += 2) {
String state = lines.get(i).trim();
String capital = lines.get(i + 1).trim();
usCapitals.put(state, capital);
}
如果usCapitals.get(state)
返回null,则可能是由于拼写错误或大写/小写。模糊匹配会很好。
public String getCapital(String state) {
state = state.trim();
String capital = usCapitals.get(state);
if (capital == null) {
Map.Entry<String, String> bestEntry = null;
int bestScore = 0;
for (Map.Entry<String, String> e : usCapitals.entrySet()) {
int score = match(state, e.getKey());
if (bestEntry == null | score >= bestScore) {
bestEntry = e;
bestScore = score;
}
}
capital = bestEntry.getValue();
Logger.getLogger(getClass().getName()).warning("State not found: " + state
+ "; best match: " + bestEntry.getKey() + " with capital " + capital);
}
return capital;
}
private static int match(String s, String t) {
if (s.isEmpty() || t.isEmpty()) {
return 0;
}
char sch = s.charAt(0);
char tch = t.charAt(0);
if (Character.toUpperCase(sch) == Character.toUpperCase(tch)) {
return 1 + match(s.substring(1), t.substring(1));
}
int ms = match(s, t.substring(1));
int mt = match(s.substring(1), t);
return Math.max(ms, mt);
}