2014-10-27 2 views
0

У меня есть проблема, которую я не могу решить. Я хочу решить 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, чтобы собрать эти данные (это только для левой части уравнения):Значения по умолчанию в 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, значение по-прежнему равно нулю. Поэтому я хочу установить значение по умолчанию для каждого значения в Hashmap равным 0. Есть ли возможность сделать это?

+1

возможно дубликат [HashMap для возвращения значения по умолчанию для не нашли ключей?] (Http://stackoverflow.com/questions/7519339/hashmap-to-return-default-value-for-non-found -keys) – dimo414

+1

Обратите внимание, что aa 'Map ' часто является ['Multiset '] (http://en.wikipedia.org/wiki/Multiset). [Guava] (https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained) предоставляет очень хороший набор ['Multiset'] (http://docs.guava-libraries.googlecode.com/ git/javadoc/com/google/common/collect/Multiset.html). Использование «Multiset» здесь позволит избежать проблемы с нулевым указателем, с которой вы работаете. – dimo414

ответ

1

Самый простой способ на сегодняшний день является написание

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

, а не возиться с организацией для вашей карты, чтобы вернуть значение по умолчанию.

Или

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

также не будет делать это.

0

Вы можете переопределить get(Object key) при создании своей HashMap. Попробуйте это во время создания Letters в своем коде, надеюсь, что это поможет.

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

Вы можете использовать массив вместо Карты. Если вы просто используете ASCII, диапазон символов сопоставляется с диапазоном индексов. Этот код также быстрее запускается, если производительность имеет значение в вашем случае.

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

... 

// Inside the for loop 
Letters[LettersWord[j] - 'A'] += (int) Math.pow(10, LettersWord.length - 1 - j); 
Смежные вопросы