如何用hashmap中的char替换字符串?

时间:2014-08-21 15:35:33

标签: java string hashmap

我有一个可编码的莫尔斯电码程序。现在我想要它解码,但我不知道如何用我的哈希映射中的字母替换一串加密字符。

以下是解码方法:

for(int i = 0; i < userInput.length(); i++){
        if(i != 0){
            morse.append(' ');
        }
        morse.append(codeLibrary.get(userInput.charAt(i))); //Currentely the same as encoding, this line needs to change
    }
    return morse.toString();

这是我的hashmap:

public static final java.util.Map<Character, String> codeLibrary;
 static{
    codeLibrary = new HashMap<>();
    codeLibrary.put('a',".-");      codeLibrary.put('b',"-...");
    codeLibrary.put('c',"-.-.");    codeLibrary.put('d',"-..");
    codeLibrary.put('e',".");       codeLibrary.put('f',"..-.");
    codeLibrary.put('g',"--.");     codeLibrary.put('h',"....");
    codeLibrary.put('i',"..");      codeLibrary.put('j',".---");
    codeLibrary.put('k',"-.-");     codeLibrary.put('l',".-..");
    codeLibrary.put('m',"--");      codeLibrary.put('n',"-.");  
    codeLibrary.put('o',"---");     codeLibrary.put('p',".--.");
    codeLibrary.put('q',"--.-");    codeLibrary.put('r',".-.");
    codeLibrary.put('s',"...");     codeLibrary.put('t',"-");
    codeLibrary.put('u',"..-");     codeLibrary.put('v',"...-");
    codeLibrary.put('w',".--");     codeLibrary.put('x',"-..-");
    codeLibrary.put('y',"-.--");    codeLibrary.put('z',"--..");
    codeLibrary.put('1',".----");   codeLibrary.put('2',"..---");
    codeLibrary.put('3',"...--");   codeLibrary.put('4',".----");
    codeLibrary.put('5',".....");   codeLibrary.put('6',"-....");
    codeLibrary.put('7',"--...");   codeLibrary.put('8',"---..");
    codeLibrary.put('9',"----.");   codeLibrary.put('0',"-----");
    codeLibrary.put(' ',"/");

2 个答案:

答案 0 :(得分:1)

你需要一个单独的地图,一个是Map<String, Character>,另一个HashMap<String, Character>会很好用,用el填充它


如果这是一项学校作业,那么我相信这就是解决方案。如果这是真正的应用程序,那么,按照Jake King的建议继续使用Guava BiMap库。


修改
你问:

  

这似乎是一个非常漫长的方式。是否无法插入值来检索密钥?

这不是普通地图的工作方式。您可以使用Key获取Value,而不是相反。但这不是很难做到也不是很长。&#34;。你甚至可以在同一个循环中填充两个地图。


例如,......

import java.util.HashMap;
import java.util.Map;

public class MorseFun {
   public static final String[] LETTER_CODES = { ".-", "-...", "-.-.", "-..",
         ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.",
         "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--",
         "-..-", "-.--", "--.." };
   public static final String[] NUMBER_CODES = { "-----", ".----", "..---",
         "...--", ".----", ".....", "-....", "--...", "---..", "----." };

   private static Map<Character, String> charToCodeMap = new HashMap<>();
   private static Map<String, Character> codeToCharMap = new HashMap<>();

   public static void main(String[] args) {
      for (int i = 0; i < LETTER_CODES.length; i++) {
         char c = (char) ('a' + i);
         String s = LETTER_CODES[i];
         charToCodeMap.put(c, s);
         codeToCharMap.put(s, c);
      }

      for (int i = 0; i < NUMBER_CODES.length; i++) {
         char c = (char) ('0' + i);
         String s = LETTER_CODES[i];
         charToCodeMap.put(c, s);
         codeToCharMap.put(s, c);
      }



   }
}

答案 1 :(得分:1)

只是扮演魔鬼的拥护者,你可以创建一个简单的实用工具方法,搜索Map Set<Entry>直到找到你需要的值;

public static Character convertMorseToChar(String yourMorse){
    for(Map.Entry<Character,String> e : codeLibrary.entrySet()){
        if(e.getValue().equals(yourMorse)) return e.getKey();
    }
    return null;
}

以上所有方法都运行enhanced for loop,并使用Set方法循环Map.entrySet()获得的Entry个对象集合。每个Entry代表地图中的键/值对。当它找到Entry并将您解析为该方法的值(您的莫尔斯代码)时,它会返回{{1}}的键(您要查找的字符)。

我希望这会有所帮助。