Java 用morsecode值替换字符串中的多个不同字符

Java 用morsecode值替换字符串中的多个不同字符,java,replace,Java,Replace,我正在写一个程序,将字符串(用户输入)转换成莫尔斯电码。起初我打算使用大量的if和elseif语句,但在java中找到了replace/replaceAll函数。thsi被证明是非常有用的。然而,由于我的编程技能一般,我无法理解如何替换同一字符串中的多个不同字符。以下是代码的一部分: Scanner reader = new Scanner(System.in); System.out.print("Enter the text you want translated to

我正在写一个程序,将字符串(用户输入)转换成莫尔斯电码。起初我打算使用大量的if和elseif语句,但在java中找到了replace/replaceAll函数。thsi被证明是非常有用的。然而,由于我的编程技能一般,我无法理解如何替换同一字符串中的多个不同字符。以下是代码的一部分:

  Scanner reader = new Scanner(System.in);
        System.out.print("Enter the text you want translated to 
Morsecode:");
        String input = reader.nextLine();
        String res = "";
        String[] letters = new String[] {"a", "b", "c", "d", "e", "f",  "g", 
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", 
"w", "x", "y", "z"};
        String[] codes = new String[] {".-", "-...", "-.-.", "-..", ".", 
"..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",  ".-
-.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", 
"-...", "--.."};
        int i=0;
        for (i=0;i<26;i++)
        {

            res = input.replaceAll(letters[i], codes[i]);
        }
        System.out.print(res);
Scanner reader=新的扫描仪(System.in);
System.out.print(“输入要翻译的文本
摩尔斯电码:);
字符串输入=reader.nextLine();
字符串res=“”;
字符串[]字母=新字符串[]{“a”、“b”、“c”、“d”、“e”、“f”、“g”,
“h”,“i”,“j”,“k”,“l”,“m”,“n”,“o”,“p”,“q”,“r”,“s”,“t”,“u”,“v”,
“w”、“x”、“y”、“z”};
字符串[]代码=新字符串[]{“-”,“-…”,“-.-”,“-…,”,
"..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",  ".-
-.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", 
"-...", "--.."};
int i=0;

对于(i=0;i使用
replaceAll
,您已走上正确的道路。以下是您如何完成此程序:

  • 制作两个
    String[]
    数组-一个带有字母,另一个带有相应的莫尔斯电码
  • 创建一个遍历数组的循环,并调用
    res=res.replaceAll(字母[i],代码[i]);
  • 替换后面应该跟空格;否则您将无法判断
    -..
    是否表示
    ab
    -
    -..
    )或
    ws
    -
这两个阵列如下所示:

String[] letters = new String[] {"a", "b", ...};
String[] codes = new String[] {".-", "-...", ...};

注意:一旦你完成了程序的初始版本,试着找出一种方法来消除
字母
数组,方法是从字母表的编号
i

生成一个带有
i
-第个字母的字符串,所有更改都必须应用到同一个字符串上:

String s = reader.nextLine();
s = s.replace("a", ".-");
s = s.replace("b", "-...");
System.out.print(s);

也可以考虑在每一个代码之后添加一个空白,用于学习目的:“.-”.< /P> < P>以字母为关键字和莫尔斯代码为值,生成“<代码> HashMap < /代码>。然后循环输入字符串,并针对字符串中的每个字符附加适当的莫尔斯代码代码,输出<代码> StringBuilder < /代码> .<

String input = "Lorem ipsum";

    Map<String, String> charTable = new HashMap<>();
    charTable.put("A", ".-");
    // other characters

    StringBuilder sbOut = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        String character = String.valueOf(input.charAt(i));

        sbOut.append(charTable.get(character));
    }

System.out.println(sbOut);
String input=“Lorem ipsum”;
Map charTable=新的HashMap();
可图表化。放置(“A”、“-”);
//其他字符
StringBuilder sbOut=新的StringBuilder();
对于(int i=0;i

这样做的好处是,与使用两个阵列的选项相比,可读性更高,调试更容易,而且我觉得(我还没有测试过)它也更高效。

虽然
replaceAll
可以用来完成您需要的任务,但它远没有达到效率,如1所示)您将在每次替换时创建字符串实例,并且2)您必须在源字符串上迭代多次(替换的每个字符一次)。一种更有效的方法是维护一个StringBuilder实例,您将在其中附加转换后的结果,并使用
source.tocharray()
对源字符串进行迭代。此外,为了避免键入多段
if
语句来替换每个字符,请将英语字符映射为对应的摩尔斯电码。那么整个替换看起来就相当简单了:

Map<Character, String> translation = new HashMap<>();
map.put('a', "._");
// repeat for each character representation
// this map can be initialized once, e.g. as a static
StringBuilder result = new StringBuilder("");
for (Character c : input.toCharArray()) {
    result.append(translation.get(c));
}
return result.toString();
Map translation=newhashmap();
图.put('a',”);
//对每个字符表示重复此操作
//此映射可以初始化一次,例如作为静态映射
StringBuilder结果=新的StringBuilder(“”);
for(字符c:input.TOCHARRAY()){
result.append(translation.get(c));
}
返回result.toString();

我同意,对每个字母使用
String.replaceAll()
就可以了。但是,不要忘了,每次替换时,JVM都会创建新字符串。因此,对于一个长字符串,GC有很多对象

我提议使用
String.tocharray()
StringBuilder
将给定字符串转换为摩尔斯电码:

public class Morse {
    private static final Map<Character, String> CODE;

    static {
        Map<Character, String> map = new HashMap<>();

        map.put('a', ".-");
        map.put('b', "-...");

        CODE = Collections.unmodifiableMap(map);
    }

    public static String encode(String str) {
        if (str == null)
            return null;

        StringBuilder buf = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            String code = CODE.get(str.charAt(i));
            buf.append(code != null ? code : " ");
        }

        return buf.toString();
    }
}
公共级莫尔斯电码{
私有静态最终地图代码;
静止的{
Map Map=newhashmap();
map.put('a',“-”);
map.put('b',“-…”);
代码=集合。不可修改地图(map);
}
公共静态字符串编码(字符串str){
如果(str==null)
返回null;
StringBuilder buf=新的StringBuilder();
对于(int i=0;i
您可以使用单个
字符串
字符串莫尔斯电码输入=输入。替换(“a”、“-”)。替换(“b”、“-…”
。试着打印出
replace
调用的结果。@jornverne不是最后一个这样做的系统输出语句吗?@Berger好的,我会给它一个提示go@BarryBBenson:问题是您有一个字符串,它是替换了
a
的原始字符串,另一个是替换了
b
的原始字符串,因此第一个字符串仍然有
b
,第二个字符串仍然有
a
@zlakad。没有必要使用
enum
,因为程序员没有理由按名称访问单个
enum
常量。这就是为什么这应该是一个容器,而不是一组单独的值。我将根据上面的示例修改我的代码,谢谢,我尝试了你的方法,看起来代码只是将字符串输入打印到程序中。我会编辑我的问题,这样你就可以看到我的问题了tried@BarryBBenson将
String res=input
放在