【问题标题】:Checking a String against a hashmap根据哈希图检查字符串
【发布时间】:2016-02-22 23:39:22
【问题描述】:

我想构建一个程序,将英语翻译成摩尔斯电码,反之亦然,我决定使用哈希映射来执行此操作,但我不确定如何通过哈希映射运行字符串并获得最后翻译出来。这是我目前的代码:

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

public class MorseCodeTranslator{

public static String translateToMorseCode() {
    String englishtoMorse = "";
    String translation = null;

    Map<Character, String> morse = new HashMap<Character, String>();
    morse.put('a', "._");
    morse.put('b', "_...");
    morse.put('c',  "_._");
    morse.put('d',  "_..");
    morse.put('e',    ".");
    morse.put('f', ".._.");
    morse.put('g',  "__.");
    morse.put('h', "....");
    morse.put('i',   "..");
    morse.put('j', ".___");
    morse.put('k',   "_.");
    morse.put('l', "._..");
    morse.put('m',   "__");
    morse.put('n',   "_.");
    morse.put('o',  "___");
    morse.put('p', ".__.");
    morse.put('q', "__._");
    morse.put('r', "._.");
    morse.put('s',  "...");
    morse.put('t',   "_");
    morse.put('u',  ".._");
    morse.put('v', "..._");
    morse.put('w',  ".__");
    morse.put('x', "_.._");
    morse.put('y', "_.__");
    morse.put('z', "__..");

    return translation;
}    

public static String translateFromMorseCode() {
    String morsetoEnglish = "";
    String translation = null;

    Map<Character, String> morse = new HashMap<Character, String>();
    morse.put('a', "._");
    morse.put('b', "_...");
    morse.put('c',  "_._");
    morse.put('d',  "_..");
    morse.put('e',    ".");
    morse.put('f', ".._.");
    morse.put('g',  "__.");
    morse.put('h', "....");
    morse.put('i',   "..");
    morse.put('j', ".___");
    morse.put('k',   "_.");
    morse.put('l', "._..");
    morse.put('m',   "__");
    morse.put('n',   "_.");
    morse.put('o',  "___");
    morse.put('p', ".__.");
    morse.put('q', "__._");
    morse.put('r', "._.");
    morse.put('s',  "...");
    morse.put('t',   "_");
    morse.put('u',  ".._");
    morse.put('v', "..._");
    morse.put('w',  ".__");
    morse.put('x', "_.._");
    morse.put('y', "_.__");
    morse.put('z', "__..");  

    return translation;
}
}  

我希望能够通过哈希映射运行 englishtoMorsemorsetoEnglish 中的任何内容,并将字符转换为与哈希映射关联的值,然后将它们输出到 translation

【问题讨论】:

  • 切换translateFromMorseCode中的键值对。如果要使用这种方法,请将 HashMap 初始化移到方法之外。
  • 除了您希望地图与translateFromMorseCode 相反之外,这听起来很合理。您是否遇到特定问题?
  • 这还不够,因为莫尔斯电码的长度不相等。
  • 是的,这是个好主意,谢谢
  • 另外,如果您可以使用 Guava,请考虑将您的映射放在 ImmutableBiMap 中,这样您就不必维护这两个映射,并一次性构建它并重复使用相同的地图实例。

标签: java string hash morse-code


【解决方案1】:

将地图创建为静态字段。添加莫尔斯字母表。然后创建一个方法 它获取要翻译的文本作为参数。然后迭代文本以翻译每个字符并使用翻译的字符创建将返回的字符串。

我已经用你的代码和我的解释做了一个例子。 该代码仅适用于莫尔斯语的英文文本。您必须添加另一个方向。

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{

    private static final Map<Character, String> morse = new HashMap<Character, String>();
    static {
    morse.put('a', "._");
    morse.put('b', "_...");
    morse.put('c',  "_._");
    morse.put('d',  "_..");
    morse.put('e',    ".");
    morse.put('f', ".._.");
    morse.put('g',  "__.");
    morse.put('h', "....");
    morse.put('i',   "..");
    morse.put('j', ".___");
    morse.put('k',   "_.");
    morse.put('l', "._..");
    morse.put('m',   "__");
    morse.put('n',   "_.");
    morse.put('o',  "___");
    morse.put('p', ".__.");
    morse.put('q', "__._");
    morse.put('r', "._.");
    morse.put('s',  "...");
    morse.put('t',   "_");
    morse.put('u',  ".._");
    morse.put('v', "..._");
    morse.put('w',  ".__");
    morse.put('x', "_.._");
    morse.put('y', "_.__");
    morse.put('z', "__..");
    morse.put(' ', " ");
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        String str = "Hello World";
        System.out.println(translate(str));
    }



    public static String translate(String text) {
        StringBuilder builder = new StringBuilder();
        String lower = text.toLowerCase();
        for (int i = 0; i < text.length(); i++) {
            builder.append(morse.get(lower.charAt(i)));
        }
        return builder.toString();
    }    

}

输出:

......_..._..___ ._____._.._.._..

工作示例:

http://ideone.com/uWGAtU

【讨论】:

  • 您的程序运行正常,但您在答案中的输出错误
  • 你说得对,谢谢。 SO的格式错误。我在输出的代码环境中制作了它。
【解决方案2】:

对于“English to Morse”用例,使用for 循环,如下所示:

StringBuilder sb = new StringBuilder();
for ( int i = 0; i < englishtoMorse.length(); i++) {
    char c = englishtoMorse.charAt(i);
    sb.append(morse.get(c));
}
translate = sb.toString();

至于“莫尔斯到英语”用例,您需要在莫尔斯字符之间使用某种分隔符。否则,您将得到一个仅包含“e”和“t”的翻译。假设,您的 morseToEnglish 字符串在字符之间使用空格作为分隔符。然后你可以这样翻译:

StringTokenizer st = new StringTokenizer(morseToEnglish);
StringBuilder result = new StringBuilder();
while( st.hasMoreTokens()) {
    result.append(morse.findKey(st.nextToken()));
}
translation = sb.toString();

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您应该初始化地图一次(例如,在静态数据成员中,就像 Zelldon 建议的那样)。完成此操作后,就可以使用 Java 8 的流 API 将字符串从英语翻译成莫尔斯语了:

    public static String translateToMorseCode(String english) {
        return english.chars()
                      .boxed()
                      .map(c -> morse.get((char) c.intValue()))
                      .collect(Collectors.joining());
    }
    

    编辑:
    正如 JB Nizet 评论的那样,使用 mapToObj 会更优雅(而且可能更高效):

    public static String translateToMorseCode(String english) {
        return english.chars()
                      .mapToObj(c -> morse.get((char) c))
                      .collect(Collectors.joining());
    }
    

    【讨论】:

    • boxed() 调用是无用的:您在以下步骤中将 Integer 拆箱。
    • @JBNizet 如果没有 boxed() 调用,您将有一个 IntStream 并且 labmda 表达式会给出编译错误 "bad return type in labmda expression: String cannot be convert to an int" 。
    • @JBNizet 更优雅,我同意。 char 的演员阵容仍然让我烦恼,但我猜没有办法避免这种情况?
    【解决方案4】:

    您可以在此处使用BiMap。我认为它更适合您的情况。

    BiMap<Character, String> biMap = HashBiMap.create();
    
    biMap.put('a', "._");
    biMap.put('b', "_..");
    
    System.out.println("morse code = " + biMap.get('a'));
    System.out.println("alphabet = " + biMap.inverse().get("._"));
    

    您可以使用guava。访问link

    【讨论】:

      【解决方案5】:

      你可以随意使用HashMap:

          import java.util.HashMap;
          import java.util.Map;
      
          public class MorseCodeTranslator{
          public static Map<Character, String> morse = new HashMap<Character, String>();
          public static Map<String, Character> english = new HashMap<>();
          public MorseCodeTranslator(){
          morse.put('a', "._");
          morse.put('b', "_...");
          morse.put('c',  "_._");
          morse.put('d',  "_..");
          morse.put('e',    ".");
          morse.put('f', ".._.");
          morse.put('g',  "__.");
          morse.put('h', "....");
          morse.put('i',   "..");
          morse.put('j', ".___");
          morse.put('k',   "_.");
          morse.put('l', "._..");
          morse.put('m',   "__");
          morse.put('n',   "_.");
          morse.put('o',  "___");
          morse.put('p', ".__.");
          morse.put('q', "__._");
          morse.put('r', "._.");
          morse.put('s',  "...");
          morse.put('t',   "_");
          morse.put('u',  ".._");
          morse.put('v', "..._");
          morse.put('w',  ".__");
          morse.put('x', "_.._");
          morse.put('y', "_.__");
          morse.put('z', "__..");
          morse.forEach( (c,s) -> english.put(s, c));
          }
      
      
          public static String translateToMorseCode(final String english) {
          char[] data = english.toCharArray();
          StringBuilder result = new StringBuilder();
          for(char c: data) result.append(morse.get(new Character(c)));
          return result.toString();
          }
      
          public static String translateFromMorseCode(final String morseCode) {
          String[] data = morseCode.split(" ");
          StringBuilder result = new StringBuilder();
          for(String s:data) result.append(english.get(s));
          return result.toString();
          }
          }
      

      【讨论】:

        【解决方案6】:

        使用一个表并使用 Map.entrySet() 进行向后搜索。并且不要忘记分隔符。

        import java.util.HashMap;
        import java.util.Map;
        import java.util.Map.Entry;
        import java.util.StringTokenizer;
        
        public class MorseCodeTranslator{
            public static Map<Character, String> getMorseTable(){
                Map<Character, String> morse = new HashMap<Character, String>();
                morse.put('a', "._");
                morse.put('b', "_...");
                morse.put('c',  "_._");
                morse.put('d',  "_..");
                morse.put('e',    ".");
                morse.put('f', ".._.");
                morse.put('g',  "__.");
                morse.put('h', "....");
                morse.put('i',   "..");
                morse.put('j', ".___");
                morse.put('k',   "_.");
                morse.put('l', "._..");
                morse.put('m',   "__");
                morse.put('n',   "_.");
                morse.put('o',  "___");
                morse.put('p', ".__.");
                morse.put('q', "__._");
                morse.put('r', "._.");
                morse.put('s',  "...");
                morse.put('t',   "_");
                morse.put('u',  ".._");
                morse.put('v', "..._");
                morse.put('w',  ".__");
                morse.put('x', "_.._");
                morse.put('y', "_.__");
                morse.put('z', "__..");
                return morse;
            }
            public static String toMorse(String text){      
                Map<Character, String> table  = getMorseTable();
                StringBuilder result = new StringBuilder();
                // get every char in text
                for(int i = 0; i < text.length(); i++){
                    char c = text.charAt(i);
                    // and add morse character from table
                    result.append(table.get(c));
                    // put character separator
                    result.append("|");
                }
                // delete last character separator
                result.deleteCharAt(result.length() - 1);
                return result.toString();
            }
        
            public static String fromMorse(String morse){
                Map<Character, String> table  = getMorseTable();
                // use string tokenizer to separate morse characters
                StringTokenizer st = new StringTokenizer(morse,"|");
                StringBuilder result = new StringBuilder();
                // get every morse character
                while( st.hasMoreTokens()) {
                    String morseChar = st.nextToken();
                    // and find equivalent letter in morse table
                    for (Entry<Character, String> entry : table.entrySet()) {
                        if (entry.getValue().equals(morseChar)) {
                           result.append(entry.getKey());
                           break;
                        }
                    }
                }
                return result.toString();
            }
        
            public static void main(String[] args){
                String text = "abcxyz";
                System.out.println(text);
                String morse = toMorse(text);
                System.out.println(morse);
                String back = fromMorse(morse);
                System.out.println(back);
            }
        }
        

        输出:

        abcxyz
        ._|_...|_._|_.._|_.__|__..
        abcxyz
        

        【讨论】:

          猜你喜欢
          • 2013-12-04
          • 2019-08-08
          • 2020-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多