我有一个可编码的莫尔斯电码程序。现在我想要它解码,但我不知道如何用我的哈希映射中的字母替换一串加密字符。
以下是解码方法:
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(' ',"/");
答案 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}}的键(您要查找的字符)。
我希望这会有所帮助。