我有一个我无法解决的问题。我想解决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.是否有可能这样做?
答案 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);