2016-03-01 3 views
0

Я предопределю этот вопрос тем фактом, что я занимаюсь только программированием на один месяц, и это задание для школы меня озадачило. В частности, это Морзе английский переводчик (и наоборот) ... вот часть, я застрял на:Попытка создать строку из строкового массива

/* 
* A program that asks the user to select which they would like to do: translate 
* from English to Morse code, or Morse code to English. The list of characters 
* for each language is stored using arrays. The program will then perform and return 
* the translations. 
*/ 
import java.util.Scanner; 

public class MorseEnglishTranslator 
{ 

    public static void main(String [] args) 
    { 
     int translateChoice = 0;     // Variable for person's choice for direction of translation 

     Scanner inputText = new Scanner(System.in); // Create a Scanner to obtain user input 
     System.out.print("Enter 1 to translate from English to Morse code, 2 for Morse code to English: "); 
     translateChoice = inputText.nextInt(); 

     if (translateChoice == 1); 
      {   
       System.out.print("Enter a letter, word, or phrase you would like translated: "); 
      }  
     if (translateChoice == 2); 
      { 
       System.out.print("Enter the Morse code you would like translated, separate letters and words with a |: "); 
      } 
     String userStr = inputText.nextLine(); 

     translator(translateChoice, userStr); 


    } // Closes main 

    public static void translator(int translateChoice, String userStr) // Method for translating either direction 
    { 
     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 s1 = String.join(" ", english); // Assigns the contents of english array to one string 

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

     String s2 = String.join("|", morse); // Assigns the contents of morse array to one searchable string 

     if (translateChoice == 1); 
      {   
       String userStrLower = userStr.toLowerCase(); // In case user capitalized anything, changes everything to lowercase 
       for (int allFound=0; allFound <userStrLower.length(); allFound ++) 
       { 
        allFound = s1.indexOf(userStrLower); // Variable 'allFound' to receive the search of s1 using userStrLower 
        System.out.print(allFound); 
       } 
      }  
     if (translateChoice == 2); 
      { 
       for (int allFound=0; allFound <userStr.length(); allFound ++) 
       { 
        allFound = s2.indexOf(userStr); // Variable 'allFound' to receive the search of s2 using userStr 
        System.out.print(allFound); 
       } 
      } 

    } // Closes translator   
} // Closes class 

строки s1 и s2 являются два варианта я созерцая с помощью, но версия s1 говорит мне, что после New была ожидаемая полуколония. Параметр соединения, который я пытался использовать как String.join vs join, говорит, что подходящий конструктор vs не может найти символ соответственно.

+2

Пожалуйста, укажите язык, который вы используете. – sschale

+1

О, извините, Java 8 –

+0

Уже сделано для нее, ей просто нужно принять! – sschale

ответ

-1

Я понимаю, что вы входите в класс Java, поэтому не стесняйтесь задавать вопросы, но вам 1) не нужно присоединяться к строкам, а 2) indexOf действительно неэффективен для целей, в которых он вам нужен. A HashMap<String, String> - идеальный объект для переводчика.

Я сделал этот двунаправленный класс карты, который может идти назад и вперед между двумя массивами String. Сохраните это в файле BiMap.java.

import java.util.HashMap; 

public class BiMap { 
    private HashMap<String, String> forwardMap; 
    private HashMap<String, String> backwardMap; 

    public BiMap(String[] from, String[] to) { 
     forwardMap = new HashMap<>(); 
     backwardMap = new HashMap<>(); 

     for (int i = 0; i < from.length && i < to.length; i++) { 
      forwardMap.put(from[i], to[i]); 
      backwardMap.put(to[i], from[i]); 
     } 
    } 

    public String translateForward(String key) { 
     return forwardMap.get(key); 
    } 

    public String translateBackward(String key) { 
     return backwardMap.get(key); 
    } 
} 

И вот пример использования этого класса. Не стесняйтесь добавлять к нему свои подсказки. Использование модификаторов static final рекомендуется для переменных переменных класса. Затем я определил некоторые методы private для извлечения логики перевода.

Это хорошая практика для написания читаемых и многоразовых методов, насколько это возможно при обучении.

public class MorseEnglishTranslator { 

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

    private static final String[] MORSE = new String[]{ 
      ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", 
      "....", "..", ".---", "-.-", ".-..", "--", "-.", 
      "---", ".--.", "--.-", ".-.", "...", "-", "..-", 
      "...-", ".--", "-..-", "-.--", "--..", ".----", 
      "..---", "...--", "....-", ".....", "-....", 
      "--...", "---..", "----.", "-----", "|"}; 

    private static final BiMap MORSE_MAP = new BiMap(ENGLISH, MORSE); 

    private static final String DELIMITER = " "; 

    private static String toMorse(String s) { 
     StringBuilder sb = new StringBuilder(); 
     String lower = s.toLowerCase(); 
     for (int i = 0; i < lower.length(); i++) { 
      String c = String.valueOf(lower.charAt(i)); 
      sb.append(MORSE_MAP.translateForward(c)).append(DELIMITER); 
     } 
     return sb.toString(); 
    } 

    private static String fromMorse(String s) { 
     String[] split = s.split(DELIMITER); 
     StringBuilder sb = new StringBuilder(); 
     for (String morse : split) { 
      sb.append(MORSE_MAP.translateBackward(morse)); 
     } 
     return sb.toString(); 
    } 

    public static void main(String[] args) { 
     String sentence = "Hello World"; 
     String morse = toMorse(sentence); 
     String translated = fromMorse(morse); 

     System.out.println(sentence); 
     System.out.println(morse); 
     System.out.println(translated); 
     System.out.println(sentence.equalsIgnoreCase(translated)); 

    } 

} 

Пример запуска

Hello World 
.... . .-.. .-.. --- | .-- --- .-. .-.. -.. 
hello world 
true 
+0

Еще раз спасибо за помощь, но, как я сказал Dongsheng, я должен использовать массивы, не говоря уже о том, что мы не перешли через Hashmaps или не читаем внешние файлы. –

+0

Я использовал массивы, я только что создал Hashmap, используя массивы. Также не читая внешние файлы вообще, просто сделал отдельный класс. Вы уже использовали классы, даже если вы не узнали, что это такое –

+0

Извините, я не знал, что мы не перешли ни с одной концепцией, поэтому я бы полон обман. Мы собираемся пройти несколько классов. Во всяком случае, это очень хорошо, просто я еще не могу обмотать голову, так как ясно, что у меня все еще есть проблема с этими «более низкими» концепциями.Я скажу, однако, похоже, что пытаться сделать эту работу, используя только массивы и строки, кажется слишком сложным, по сравнению с альтернативами. :) –

Смежные вопросы