【问题标题】:Translating multiple characters into one将多个字符转换为一个
【发布时间】:2012-08-19 05:49:14
【问题描述】:

我需要帮助将摩尔斯电码转换为英语。我已经编写并测试了将英语翻译成莫尔斯语的代码。我的主要问题是在将莫尔斯电码中的所有字符放在一起之前将其翻译成英文字符(如果有意义的话)。

例如:“。”翻译成 E 和 ... 翻译成 S,但我不希望翻译开始直到它到达 ...

几条规则 - 空格用于分隔莫尔斯字母 -|用作分隔单词的分隔符 -不能使用哈希图:(

这是我的代码

import java.util.Arrays;
import javax.swing.JOptionPane;

public class test3
{
public static void main ( String [] args )
{

    String s1 = "Morse";

    // Decide whether Morse code or English
    String decide = JOptionPane.showInputDialog("Enter 'English' for Morse to English code translation and 'Morse' for English to Morse code translation. Pay attention to Caps.");

    // Enter String & decide whether to convert to Morse or English
    String phrase = JOptionPane.showInputDialog("Enter the words you wish to translate.");

    if ( decide.equals( s1 ))
        toMorse( phrase );

    else
        toEnglish( phrase );
}

// Translate to Morse
public static void toMorse( String preTranslation )
{

    String[] english = {"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","1","2","3","4","5","6","7","8","9","0"};

    String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..", ".---",
            "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-", 
            "...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    // Remove uppercase
    String preTrans = preTranslation.toLowerCase();

    // Deletes spaces
    String phraseWithDelimiter = preTrans.replace( " ", "|");

    String[] translation = new String[phraseWithDelimiter.length()];
    String[] delimiter = {"|"};

    // Translate 
    for ( int arrayVar = 0, transArrayVar = 0, subStringVarB = 0, subStringVarE = 1; transArrayVar < phraseWithDelimiter.length();)
    {
        if( phraseWithDelimiter.substring(subStringVarB, subStringVarE).equals( delimiter[0] ) )
        {
            translation[transArrayVar] = delimiter[0];
            transArrayVar++;
            subStringVarB++;
            subStringVarE++;
        }
        else if ( phraseWithDelimiter.substring(subStringVarB, subStringVarE).equals( english[arrayVar] ) )
            {
                translation[transArrayVar] = morse[arrayVar];
                transArrayVar++;
                subStringVarB++;
                subStringVarE++;
                arrayVar = 0;
            }
            else
            {
                arrayVar++;
                if ( arrayVar == 35 )
                {
                    arrayVar = 0;
                    subStringVarB++;
                    subStringVarE++;
                    transArrayVar++;
                }
            }
    }
String morseSeparator = new String( " " );
arrayToString ( translation, morseSeparator );

}


//Convert array to string and print translation
public static void arrayToString(String[] trans, String separator) 
{
    String result = "";
    if (trans.length > 0) 
    {
            result = trans[0];    // start with the first element
            for (int i = 1; i < trans.length; i++)
                result = result + separator + trans[i];
        }
    System.out.println( result );
}

    // unfinished
public static void toEnglish( String preTranslation)
{
    }

我正在考虑创建一个 for 语句并将摩尔斯电码的每个字符分配给一个新字符串,直到我到达一个空格,然后使用它进行测试,但我不确定如何做到这一点。

感谢任何帮助!

【问题讨论】:

  • 为什么不允许使用HashMap?我会说使用TreeMap,但我想你也不允许使用它,是吗?这个需求感觉像是作业,如果是这种情况,请添加相应的标签。
  • 在使用String.split() 处理之前,您应该在管道和空间周围分割莫尔斯输入。你会得到一个单词列表,每个单词都是完整的莫尔斯字母列表;您可以轻松地将它们与您的字母表进行比较。

标签: java character translate


【解决方案1】:

为了翻译文本,您可以尝试先在单词分隔符上拆分,然后在字符限制符上拆分。然后一一处理单词。类似这样:

String morseInput = //whatever, only delimiters or morse characters

String[] words = morseInput.split("-|");
for( String word : words ) {
  String[] characters = word.split("\\s");

  for( String c : characters ) {
    //look up the english character for c - I'd use a map here
  }
}

一些注意事项:

  • 为了简洁,我省略了对空字符串和 null 的检查
  • 我还省略了构建最终翻译字符串的任何代码,这是给你的练习
  • 我会使用Map&lt;String, String&gt; 进行查找,如果不允许,请在源数组中查找字符的索引,然后从翻译数组中获取该索引处的翻译

【讨论】:

  • 如果你在字面上拆分,你可能应该使用Pattern.quote(),更容易确保所有内容都正确转义。
【解决方案2】:

创建一个包含所有摩尔斯电码序列的正则表达式,按从长到短的顺序排列。

 Pattern.compile("----\\.|-----|---\\.\\.|...")

然后将其与字符串重复匹配以获得最长的有效摩尔斯电码序列。


或者,您可以使用解析器编译器,例如 JavaCC

SKIP : { " " }
TOKEN : { < A : "-." > }
TOKEN : { < B : "-..." > }
TOKEN : { < C : "-.-." > }
...

String translate() :
{ StringBuilder sb; }
{
  { sb = new StringBuilder(); }

  (
    letter(sb)
  )*
  <EOF>

  { return sb.toString(); }
}

void letter(StringBuilder sb) :
{}
{
  ( <A>
    { sb.append('a'); }
  | <B>
    { sb.append('b'); }
  | <C>
    { sb.append('c'); }
  ...
  )
}

【讨论】:

  • 为了使构建该模式更容易,您可能希望循环遍历 morse 数组(应正确排序)并动态构建该模式。
  • @Thomas,是的。如果你可以使用Google commons,你可以使用"\\Q" + Joiner.on("\\E|\\Q").join(morse) + "\\E"
  • 那么我该如何使用pattern.compile呢?有没有一种方法可以只测试该方法的某个部分,即使每次长度都不同?
  • @Albert, Pattern x = Pattern.compile(...) 将在x 中为您提供模式实例。然后,您可以执行 x.matcher(myString) 来获取匹配器,Matcher javadoc 解释了如何使用 findgroupstartend 方法将字符串迭代地分解为最大块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多