【问题标题】:How to replace a string with char from a hashmap?如何用哈希图中的字符替换字符串?
【发布时间】:2014-08-21 15:35:33
【问题描述】:

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

解码方法如下:

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();

这是我的哈希图:

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(' ',"/");

【问题讨论】:

  • 如果您愿意使用 Guava,您可以使用 BiMap
  • 这似乎是正确的做法。谢谢

标签: java string hashmap


【解决方案1】:

你需要一个单独的地图,一个是Map&lt;String, Character&gt;,一个HashMap&lt;String, Character&gt; 会很好用,用 el 填充它


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


编辑
你问:

这似乎是一个很长的路要走。不能插入值来检索密钥吗?

这不是普通地图的工作方式。您使用 Key 来获取 Value,而不是相反。但这并不难,也不是很“长”。您甚至可以在同一个循环中填充两个地图。


例如……

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);
      }



   }
}

【讨论】:

  • 这似乎是一个很长的路要走。是不是不能插入值来检索key?
  • @mungostrap:这不是普通地图的工作方式。您使用 Key 来获取 Value,而不是相反。但这并不难做到。你甚至可以在同一个循环中填充两个地图。
  • @mungostrap 在没有外部库的情况下,一种非常低效且丑陋的方法是使用iterate through the Map.Entry set 并等于Entry#getValue() 来检索Entry#getKey()。但同样,这很糟糕,你应该选择这个答案解决方案。
【解决方案2】:

只是为了扮演魔鬼的拥护者,您可以创建一个简单的实用程序方法,搜索MapSet&lt;Entry&gt;,直到找到您需要的值;

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,并循环使用.entrySet() 方法从Map 获得的Entry 对象的Set 集合。每个Entry 代表映射中的一个键/值对。当它找到 Entry 与您解析到方法中的值(您的摩尔斯电码)时,它会返回 Entry 的密钥(您正在寻找的字符)。

我希望这会有所帮助。

【讨论】:

  • 对不起,我对 Java 和地图很陌生。你能解释一下这是做什么的吗?
  • @mungostrap - 当然,没问题。我添加了代码的简要说明和一些链接,这些链接可以帮助您进一步阅读可能需要的内容。
  • 谢谢老兄,我选择尝试气垫船的方式
猜你喜欢
  • 2017-01-16
  • 2020-04-10
  • 2011-11-19
  • 2013-09-10
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多