我想建立一个程序,将英语翻译成莫尔斯电码,反之亦然,我决定使用哈希图来完成这项工作,但我不确定如何通过哈希图运行字符串并在最后得到翻译。这是我目前的代码:
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;
}
}
我希望能够通过哈希映射运行englishtoMorse
或morsetoEnglish
中的任何内容,并将字符转换为哈希映射中与其关联的值,然后在translation
中输出它们。
将映射创建为静态字段。加上莫尔斯字母表。然后创建一个方法其获取要翻译的文本作为参数。然后迭代文本以翻译每个字符,并使用翻译的字符创建将返回的字符串。
我用你的代码和我的解释做了一个例子。该代码仅适用于莫尔斯电码中的英文文本。您必须添加另一个方向。
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
对于"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();
至于"Morse to English"用例,您需要在莫尔斯字符之间使用某种分隔符。否则,您将得到一个仅由"e"one_answers"t"组成的翻译。假设您的morseToEnglish
字符串使用空格作为字符之间的分隔符。然后你可以这样翻译:
StringTokenizer st = new StringTokenizer(morseToEnglish);
StringBuilder result = new StringBuilder();
while( st.hasMoreTokens()) {
result.append(morse.findKey(st.nextToken()));
}
translation = sb.toString();
我希望这能有所帮助。
您应该初始化映射一次(例如,在静态数据成员中,如Zeldon建议的那样)。一旦你做到了这一点,就可以使用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());
}
您可以在此处使用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
。访问链接
您可以随心所欲地使用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();
}
}
使用一个表并使用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