2013-10-13 48 views
1

我的程序是將輸入從英語轉換爲莫爾斯碼,反之亦然。首先,它會提示用戶是否要輸入莫爾斯電碼或英文。之後,它將一個轉換爲另一個。我正在研究如何將莫爾斯電碼翻譯成英文。我正在使用這個包含莫爾斯字母的數組:使用拆分方法將字符串轉換爲字符

String[] codes = {".- ", "-... ", "-.-. ", "-.. ", ". ", "..-. ", "--. ", ".... ", ".. ", ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ", ".-. ", "... ", "- ", "..- ", "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", ".---- ", "..--- ", "...-- ", "....- ", "..... ", "-.... ", "--... ", "---.. ", "----. ", "----- ", "| "}; 

用戶輸入必須以特定方式格式化。在輸入莫爾斯電碼時,代表一個字母的每組字符必須用空格分隔。每個完整的單詞必須用直線分隔(「|」)。標點和大寫是沒有必要的。

下面是一個例子來闡明:

輸入:

- .... .. ... | .. ... | .- | - . ... - 

輸出:

THIS IS A TEST 

我的代碼如下:

import javax.swing.JOptionPane; 

public class ProjectOne 
{ 
    public static void main (String[] args) 
    { 
     String decision = getString ("Will you be typing in English or Morse Code?"); 
     String english = "english"; 
     String morse = "morse"; 
     String[] codes = {".- ", "-... ", "-.-. ", "-.. ", ". ", "..-. ", "--. ", ".... ", ".. ", ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ", ".-. ", "... ", "- ", "..- ", "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", ".---- ", "..--- ", "...-- ", "....- ", "..... ", "-.... ", "--... ", "---.. ", "----. ", "----- ", "| "}; 
     char[] letters = {'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', ' '}; 

     if (decision.equalsIgnoreCase(morse)) 
     { 
      for (int a = 0; a < codes.length; a++) 
      { 
       codes[a] = codes[a].trim(); 
      } 

      String input = getString ("Enter a phrase to be translated to English:"); 
      String[] parts = input.split(" "); 

      for (int n = 0; n < parts.length; n++) 
      { 
       for (int i = 0; i < parts.length; ++i) 
       { 
        if (parts[n].equals(codes[i])) 
        { 
         System.out.print(letters[i]); 
        } 
       } 
      } 
     } 
     else if (decision.equalsIgnoreCase(english)) 
     { 
      //Translates English to Morse Code 
     } 
     else 
     { 
      System.out.println("Invalid Input - Type 'English' or 'Morse'"); 
     } 
    } 

    public static String getString(String paramString) 
    { 
     String str = JOptionPane.showInputDialog(paramString); 
     return str; 
    } 
} 

我的問題是英語翻譯ish沒有正確顯示。當嘗試我上面提供的示例時,輸出將顯示「HIIAE」。我的目的是首先從包含莫爾斯電碼字符的數組中的每個字符串的末尾修剪額外的空間,然後將用戶的輸入按每個字母之間的空格分開並匹配各個部分,最後顯示相應的字符與英文字母的數組。我能做些什麼來讓我的程序將摩爾斯電碼中的用戶輸入翻譯成英文?

+0

你說你自己,話是對用「'|'」分隔。你爲什麼忽略這個事實? –

+0

@ PM77-1 - 他不會無視它的。他將管道字符翻譯成空格(以分隔單詞)。這種情況是每個數組中的最後一項。 – DaoWen

+2

你的第二個循環似乎有錯誤的界限:'for(int i = 0; i DaoWen

回答

3

正如我在上面的評論中所說的,問題是一個界限錯誤。你的內部循環應該循環遍歷你的codes數組中的每個索引,但是使用parts.length作爲上限。由於您的示例輸入只有14個分段,因此內部循環只會嘗試匹配字母表的前14個字母。這意味着N之後的任何字母都不會出現。如果N,則牛逼HI小號小號一個牛逼Ë後過濾掉所有的信件 ST成爲HIIAE。看起來熟悉?

這個版本可以正常工作:

 for (int n = 0; n < parts.length; n++) 
     { 
      for (int i = 0; i < codes.length; ++i) 
      { //    ^Fixed the loop bound here 
       if (parts[n].equals(codes[i])) 
       { 
        System.out.print(letters[i]); 
        break; // Quit inner loop once you find a match 
       } 
      } 
     } 
     System.out.println(); // Add a trailing newline 

然而,這是找到匹配的真正低效的方式,無論是在時間複雜度(需要多長時間找到匹配)和複雜性方面代碼本身。而不是循環每個莫爾斯電碼段整個陣列上,試圖找到一個匹配,你可以只在一個HashMap推兩個陣列和做的查找更加簡單:

// Initialize the map for Morse code lookup 
Map<String, Character> lookup = new HashMap<>(); 
for (int i=0; i<codes.length; i++) lookup.put(codes[i], letters[i]); 

// Build the result string by looking up each Morse code segment in the map 
StringBuilder result = new StringBuilder(); 
for (int i=0; i<parts.length; i++) result.append(lookup.get(parts[i])); 
System.out.println(result);