当前位置: 首页 > 知识库问答 >
问题:

尝试从字符串数组创建字符串

党星鹏
2023-03-14

在这个问题之前,我先要说明一个事实,那就是我学习编程才一个月,而这个学校的作业却把我难住了。具体地说,它是摩尔斯电码到英语翻译器(反之亦然)...这是我被困住的部分:

/* 
*  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

共有1个答案

谢泉
2023-03-14

我知道您正在学习Java类的介绍,所以可以随意提问,但您1)不需要连接字符串,2)indexof对于您需要的目的来说效率确实很低。hashmap 是翻译器的完美对象。

我制作了这个可以在两个字符串数组之间来回的双向映射类。将其保存到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
 类似资料:
  • 问题内容: 我在PostgreSQL中有一个表,其中包含: 是类型,它包含具有正确顺序的该行的父记录列表。 家长:然后再 如何编写一个查询,该查询对于任何给定的ID都会生成其父母姓名的字符串? 例如: :。 :。 :。 编辑: 如果可能的话,我希望请求的ID总是会出现。 :。 :。 :。 :。 问题答案: 您可以结合使用诸如generate_subscripts和array之类的多项操作来获得结果

  • 问题内容: 我如何提取字符串[]或arraylist中的所有元素,并以适当的格式(所有空格之间使用单个空格)组合所有单词并存储在数组中。 输出:Java很酷。 问题答案: 使用。 或使用Apache Commons Lang 。 或使用Java8的。

  • 问题内容: 我有一个字符串形式: 依此类推(长度会有所不同)。由此创建字典的最简单方法是什么? 我知道我可以拆分,但是我无法获得正确的语法。如果我分开,那么我如何将这两个部分结合在一起? 对此进行迭代似乎很痛苦。 问题答案: 编辑:下一个解决方案是当您想要将值作为整数,我认为这是您想要的。

  • 问题内容: 这是一个非常基本的问题。但是我无法在Java文档中找到答案,也无法对其进行测试,因为我不知道这种方法是否存在。 我可能会收到一个URL字符串,可能是 要么 然后我会得到可能以开头的资源路径,或者就像 我正在看课,可以处理第一部分,即获取hostURL使其成为HTTPS或HTTP请求。问题是附加资源路径。我必须手动检查它的第一个字母是否存在。我想知道此功能是否已经在某个类中。 问题答案:

  • 我是初学C#的,我想为学校创建一个计算器,但是在第45行出现了一个错误。错误消息:字符串长度必须正好为一个字符。我认为在拆分String数组然后另存为char数组之后会有一个错误。但我不知道为什么,也许是假的。 代码部分: 错误消息由char[]发送。 我想我有一个从字符串[]分裂的翻译错误

  • 我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中