需要编写java程序将英文转换为盗版

时间:2016-03-30 23:29:23

标签: java hashmap translation

我基本上需要一个将英语句子翻译成海盗谈话的java程序。这里真正关注的是使用Map(Hashmap)。这是我到目前为止所做的。

首先,我使用了转换表并将其放入哈希映射中。 之后我使用了for循环,因此程序可以循环输入并找到需要翻译的单词。

让我举个例子:"教授想知道附近是否有餐馆。"

应翻译为:

"第'上限想要t'知道是否有一个厨房宽边。 Arrr"

但我的输出看起来像这样:

帽子想要t'知道附近是否有厨房。

如果是"句末词"翻译必须打印出来,然后是" Arr"。 ("嘿。" - >" avast。Arr。")

我的代码执行此操作。我尝试了一些代码,但没有一个能正常工作。

我正在使用Junit Test。所以我面临的另一个问题是,如果我翻译任何一个词,就让我们说"你好"它给了我翻译" ahoy"里面有个空格。

我该如何避免这种情况?

我是Java的新手,我将不胜感激。

package pirate;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class PirateTranslator
{
public static void main(String[] args)
{
    Map<String, String> hashmap = new HashMap<>();
    hashmap.put("hello", "ahoy");
    hashmap.put("hi", "yo-ho-ho");
    hashmap.put("hey", "avast");
    hashmap.put("my", "me");
    hashmap.put("friend", "me bucko");
    hashmap.put("sir", "matey");
    hashmap.put("madam", "proud beauty");
    hashmap.put("stranger", "scurvy dog");
    hashmap.put("officer", "foul blaggard");
    hashmap.put("where", "whar");
    hashmap.put("is", "be");
    hashmap.put("are", "be");
    hashmap.put("the", "th");
    hashmap.put("you", "ye");
    hashmap.put("your", "yer");
    hashmap.put("you're", "ye be");
    hashmap.put("we're", "we be");
    hashmap.put("old", "barnacle-covered");
    hashmap.put("attractive", "comely");
    hashmap.put("happy", "grog-filled");
    hashmap.put("nearby", "broadside");
    hashmap.put("restroom", "head");
    hashmap.put("restaurant", "galley");
    hashmap.put("hotel", "fleabag inn");
    hashmap.put("bank", "buried treasure");
    hashmap.put("yes", "aye");
    hashmap.put("yes!", "aye aye!");
    hashmap.put("addled", "mad");
    hashmap.put("after", "aft");
    hashmap.put("money", "booty");
    hashmap.put("professor", "cap'n");
    hashmap.put("food", "grub");
    hashmap.put("of", "o'");
    hashmap.put("quickly", "smartly");
    hashmap.put("to", "t'");
    hashmap.put("and", "an'");
    hashmap.put("it's", "it be");
    hashmap.put("right", "starboard");
    hashmap.put("left", "port");

Scanner scan = new Scanner(System.in);
        String token = scan.nextLine();
        String[] result = token.split("\\s");
        for (int i = 0; i < result.length; i++)
        {
            if (hashmap.containsKey(result[i]))
            {
                result[i] = hashmap.get(result[i]);
            }
            System.out.print(result[i] + " ");
        }
    }
}

3 个答案:

答案 0 :(得分:2)

只需将其添加为“&#39;最后一行o&#39;你的代码,

if (token.endsWith("."))
    System.out.print(" Arrr.");

还有其他问题,例如&#34; left&#34;作为一个方向应该被翻译,但不是动词的过去时态&#34;离开&#34;,即&#34;我把它留在&#34;不应该翻译成&#34;我把它移到&#34;,不是那个右舷?

答案 1 :(得分:2)

一些没有代码的建议,因为我打赌你可以创建自己的代码并做得很好。 for循环中的逻辑应包括:

  • 在空格上拆分字符串 - 你这样做。我自己,我会添加外卡以允许一个或多个空白字符,token.split("\\s+")
  • 检查每个令牌是否有终端标点符号。 - 有很多方法可以做到这一点,包括使用token.charAt(token.length() - 1) == '.'检查令牌中的最后一个字符,或者执行token.contains(".")。如果你知道你只会处理句号,那么这很简单。如果你有其他标点符号,这可能会变得更复杂。
  • 删除并保存标点符号。如果你知道它只是一个时期,这很简单。如果它可以是逗号或更多,这将变得更复杂。
  • 如果token是HashMap中的键,则将其替换为HashMap中的文本。你已经这样做了。
  • 如果出现终端标点符号,请将其添加回来并添加“Arr”。
  • 如果没有终端标点符号,请添加空格。 “”。

答案 2 :(得分:-1)

以下是您要求的内容(请参阅我在源代码旁边的评论):

package pirate;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class PirateTranslator {

    //declared a static constant containing the finishing word.
    private static final String ARR = " Arr.";

    public static void main(String[] args) {

        Map<String, String> hashmap = new HashMap<String, String>();
        hashmap.put("hello", "ahoy");
        ...
        hashmap.put("left", "port");

        Scanner scan = new Scanner(System.in);
        String token = scan.nextLine();
        String[] result = token.split("\\s");

        //use StringBuilder class for string concatenation
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < result.length; i++) {
            String word = result[i];

            //remove full stop from the input if exists
            if(word.endsWith("."))
            {
                word = word.substring(0, word.lastIndexOf("."));
            }

            if (hashmap.containsKey(word)) {

                //insert space in front of the next word except for the first and the last one.
                if(sb.length() > 0 && i < result.length - 1)
                {
                    sb.append(" ");
                }

                //translate and concatenate the next word
                sb.append(hashmap.get(result[i]));
            }
        }

        //don't include full stop after exclamation character
        if(sb.lastIndexOf("!") == -1 && sb.lastIndexOf(".") == -1)
        {
            sb.append(".");
        }

        //append final ' Arr.'
        sb.append(ARR);

        //print out the translated sentence.
        System.out.print(sb.toString());
    }
}