Hashmap中的默认值

时间:2014-10-27 19:25:44

标签: java hashmap default-value

我有一个我无法解决的问题。我想解决Alphametics(例如SEND + MORE = MONEY - > O = 0,M = 1,Y = 2,E = 5,N = 6,D = 7,R = 8,S = 9)所以我试图用这样的方程式:1000 * S + 100 * E + 10 * N + D + 1000 * M + 100 * O + 10 * R + E = 10000 * M + 1000 * O + 100 * N + 10 * E + Y 所以我尝试使用Hashmap来收集这些数据(这只是方程的左侧):

Scanner s = new Scanner(System.in);
        int HowMuchWords = s.nextInt();
        String[] Words = new String[HowMuchWords];
        for(int i = 0; i<Words.length;i++){
            Words[i] = s.next().toUpperCase();
        }
        HashMap<Character,Integer> Letters = new HashMap<Character, Integer>();

        for(int i = 0;i<Words.length;i++) {
            char[] LettersWord = Words[i].toCharArray();
            for (int j = 0; j < LettersWord.length; j++) {
                Letters.put(LettersWord[j],Letters.get(LettersWord[j])+(int) Math.pow(10, LettersWord.length - 1 - j));
       }

但是我遇到了Letters.get命令的问题。因为我想将数字添加到null,所以Value仍为null。所以我想将Hashmap中每个值的默认值设置为0.是否有可能这样做?

3 个答案:

答案 0 :(得分:1)

到目前为止,最简单的方法是编写

Integer r = Letters.get(...);
if (r==null)
    r=0;

而不是安排你的地图返回默认值。

或者

int r = Letters.contains(...) ? Letters.get(...) : 0;

也会这样做。

答案 1 :(得分:1)

您可以在创建HashMap时覆盖get(Object key)。在代码中创建Letters期间尝试此操作,希望它有所帮助。

 HashMap<Character,Integer> Letters = new HashMap<Character, Integer>(){
                @Override
                public Integer get(Object key) {
                    if(containsKey(key)){
                       return super.get(key);                          
                    }
                    return 0;
                }
            };

答案 2 :(得分:0)

您可以使用数组而不是Map。如果您只是使用ASCII,则字符范围映射到一系列索引。如果性能在您的情况下很重要,则此代码也可以更快地运行。

int[] Letters = new int['Z' - 'A' + 1];

...

// Inside the for loop
Letters[LettersWord[j] - 'A'] += (int) Math.pow(10, LettersWord.length - 1 - j);