Java map.get()方法返回null

时间:2018-07-18 11:28:03

标签: java dictionary

我正在创建一个程序,在其中我从.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

我不确定是什么问题。

2 个答案:

答案 0 :(得分:1)

您的问题出在for循环中,您想在其中将州和大写字母放在地图中:

 usCapitals.put(usStates[y], uSCapitals[y]);

您有两个选择:

  1. 您要么更改尝试从地图中获取值的方式,要么执行get("Montana")

  2. 如果要执行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);
}