我基本上需要一个将英语句子翻译成海盗谈话的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] + " ");
}
}
}
答案 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(".")
。如果你知道你只会处理句号,那么这很简单。如果你有其他标点符号,这可能会变得更复杂。答案 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());
}
}