记得读书时,计算机老师专门讲过莫斯码,莫斯码是一种早期的数字化通信方式。尽管现在的通信手段和方式已经用不上莫斯码,但知道其实现原理还是很有必要的。所以趁着休息时,用Java实现莫斯码的互换方式,其实就是Map的运用。实现后还他人用莫斯码在群里交流秀了一把,当时好不欢乐。代码如下:
// Morse Code
Java实现莫斯码
// An highlighted block
package org.algorithm;
import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Iterator;
public class MorseCode
{
Map maplist = new HashMap();
private Map mc()
{
//System.out.println("摩尔斯电码");
maplist.put('A', ".-");
maplist.put('a', "._");
maplist.put('B', "-...");
maplist.put('b', "_...");
maplist.put('C', "-.-.");
maplist.put('c', "_._.");
maplist.put('D', "-..");
maplist.put('d', "_..");
maplist.put('E', ".");
maplist.put('e',",");
maplist.put('F', "..-.");
maplist.put('f', ".._.");
maplist.put('G', "--.");
maplist.put('g', "__.");
maplist.put('H', "....");
maplist.put('h', ",,,");
maplist.put('I', "..");
maplist.put('i', ",,");
maplist.put('J', ".---");
maplist.put('j', ".___");
maplist.put('K', "-.-");
maplist.put('k', "_._");
maplist.put('L', ".-..");
maplist.put('l',"._..");
maplist.put('M', "--");
maplist.put('m', "__");
maplist.put('N', "-.");
maplist.put('n', "_.");
maplist.put('O', "---");
maplist.put('o', "___");
maplist.put('P', ".--.");
maplist.put('p', ".__.");
maplist.put('Q', "--.-");
maplist.put('q', "__._");
maplist.put('R', ".-.");
maplist.put('r', "._.");
maplist.put('S', "...");
maplist.put('s', ",,,,");
maplist.put('T', "-");
maplist.put('t', "_");
maplist.put('U', "..-");
maplist.put('u', ".._");
maplist.put('V', "...-");
maplist.put('v', "..._");
maplist.put('W', ".--");
maplist.put('w', ".__");
maplist.put('X', "-..-");
maplist.put('x', "_.._");
maplist.put('Y', "-.--");
maplist.put('y', "_.__");
maplist.put('Z', "--..");
maplist.put('z', "__..");
/* 数字电码0-9 */
maplist.put('0', "-----");
maplist.put('1', ".----");
maplist.put('2', "..---");
maplist.put('3', "...--");
maplist.put('4', "....-");
maplist.put('5', ".....");
maplist.put('6', "-....");
maplist.put('7', "--...");
maplist.put('8', "---..");
maplist.put('9', "----.");
/* 标点符号,可自增删 */
maplist.put(',', "--..--"); // ,逗号
maplist.put('.', ".-.-.-"); // .句号
maplist.put('?', "..--.."); // ?问号
maplist.put('!', "-.-.--"); // !感叹号
maplist.put('\'', ".----.");// '单引号
maplist.put('\"', ".-..-.");// "引号
maplist.put('=', "-...-"); // =等号
maplist.put(':', "---..."); // :冒号
maplist.put(';', "-.-.-."); // ;分号
maplist.put('(', "-.--."); // (前括号
maplist.put(')', "-.--.-"); // )后括号
maplist.put(' ', " "); // 空格
return maplist;
}
//摩尔斯码加密
private StringBuffer chrToMorse()
{
String str = "Love is a fire which burns unseen.";
//char plainText[] = str.toUpperCase().toCharArray();//明文
char plainText[] = str.toCharArray();
StringBuffer cipherStr = new StringBuffer(""); // 密文字符串
Map passDic = mc();
for(int i=0;i<plainText.length;i++)
{
char tmp = plainText[i];
//System.out.printf("%c", plainText[i]);
if(passDic.containsKey(tmp))
{
cipherStr.append(passDic.get(tmp)).append("●");
}
}
System.out.println("摩尔斯电码:"+cipherStr);
return cipherStr;
}
//摩尔斯解码,此方法与上面的加密约定实现
private void morseToChr()
{
StringBuffer mor = chrToMorse();
String m[] = mor.toString().split("●");
Map passDic = mc();
System.out.print("摩尔斯译文:");
for(int j=0;j<m.length;j++)
{
if(passDic.containsValue(m[j]))
{
//定义方法,返回Key
getMapKey(m[j],passDic);
}
}
System.out.println();
}
//摩尔斯解码,此方法独立实现,用于接收外部密电
private void morseToChr(StringBuffer mCode)
{
System.out.println("摩尔斯电码2:"+mCode);
String n[] = mCode.toString().split("●");
Map passDic = mc();
System.out.print("摩尔斯译文2:");
for(int h=0;h<n.length;h++)
{
if(passDic.containsValue(n[h]))
{
getMapKey(n[h],passDic);
}
}
System.out.println();
}
//通过值取key
private void getMapKey(String mv,Map m)
{
Set set = m.entrySet();
Iterator it = set.iterator();
String key = "";
while(it.hasNext())
{
Entry<String, Object> enter = (Entry<String, Object>)it.next();
if(enter.getValue().equals(mv))
{
key = String.valueOf(enter.getKey());
System.out.print(key);
}
}
}
public static void main(String args[])
{
System.out.println("--------摩尔斯电码转换--------");
//String str = "I love China!";
StringBuffer mCode = new StringBuffer("-..●.●.-●.-.● ●-.--●.-●-.●--.●--..--●....●.-●.--.●.--.●-.--● ●-...●..●.-.●-●....●-..●.-●-.--●-.-.--● ●..● ●....●---●.--.●.● ●-●---●-..●.-●-.--● ●-●.-.●.●.-●-●...● ●-.--●---●..-● ●.--●.●.-..●.-..●.-.-.-●");
//new MorseCode().chrToMorse();
new MorseCode().morseToChr();
new MorseCode().morseToChr(mCode);
}
}