需要编写 java 程序将英语转换为海盗谈话
need to write java program to convert english to pirate talk
我基本上需要一个 java 程序,可以将英语句子翻译成海盗谈话。这里真正的重点是使用一个映射(Hashmap)。这是我目前所拥有的。
首先,我使用了一个翻译table,并将其放入哈希映射中。
之后我使用了一个 for 循环,所以程序可以循环输入并找到需要翻译的单词。
举个例子:"the professor wants to know if there is a restaurant nearby."
应翻译为:
"th' cap'n wants t' know if there be a galley broadside. Arrr."
但是我的输出是这样的:
船长想知道附近是否有厨房。
如果是 "end-of-sentence word",则必须打印翻译,然后是 "Arr"。 ("hey." --> "avast. Arr.")
我的代码不会这样做。我尝试了一些代码,但其中 none 个代码工作正常。
我正在使用 Junit 测试。所以我面临的另一个问题是,如果我翻译任何单词,就说 "hello" 它给我的翻译 "ahoy " 里面有 space。
如何避免这种情况?
我是 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] + " ");
}
}
}
这是您要求的(请参阅我在源代码旁边的评论):
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());
}
}
只需将其添加为代码的最后一行,
if (token.endsWith("."))
System.out.print(" Arrr.");
还有其他问题,例如"left"作为方向应该翻译,而不是动词"to leave"的过去式,即"I left it behind"不应该翻译成"I port it behind",那不是右舷吗?
一些没有代码的建议,因为我敢打赌您可以创建自己的代码并把它做好。 for 循环中的逻辑应包括:
- 将字符串拆分成白色 space -- 你这样做。我自己会添加通配符以允许一个或多个白色-space 字符,
token.split("\s+")
- 检查每个标记的末尾标点符号。 -- 有很多方法可以做到这一点,包括使用
token.charAt(token.length() - 1) == '.'
检查令牌中的最后一个字符,或者执行 token.contains(".")
。如果您知道自己只会处理经期,那么这很容易做到。如果您可能有其他标点符号,这可能会变得更复杂。
- 删除并保存标点符号。如果你知道这只是一个时期,这很简单。如果可以是逗号或更多,这会变得有点复杂。
- 如果令牌是 HashMap 中的键,请将其替换为 HashMap 中的文本。你已经这样做了。
- 如果存在末尾标点符号,请将其重新添加并添加 "Arr"。
- 如果没有结尾标点符号,请添加 space。 " ".
我基本上需要一个 java 程序,可以将英语句子翻译成海盗谈话。这里真正的重点是使用一个映射(Hashmap)。这是我目前所拥有的。
首先,我使用了一个翻译table,并将其放入哈希映射中。 之后我使用了一个 for 循环,所以程序可以循环输入并找到需要翻译的单词。
举个例子:"the professor wants to know if there is a restaurant nearby."
应翻译为:
"th' cap'n wants t' know if there be a galley broadside. Arrr."
但是我的输出是这样的:
船长想知道附近是否有厨房。
如果是 "end-of-sentence word",则必须打印翻译,然后是 "Arr"。 ("hey." --> "avast. Arr.")
我的代码不会这样做。我尝试了一些代码,但其中 none 个代码工作正常。
我正在使用 Junit 测试。所以我面临的另一个问题是,如果我翻译任何单词,就说 "hello" 它给我的翻译 "ahoy " 里面有 space。
如何避免这种情况?
我是 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] + " ");
}
}
}
这是您要求的(请参阅我在源代码旁边的评论):
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());
}
}
只需将其添加为代码的最后一行,
if (token.endsWith("."))
System.out.print(" Arrr.");
还有其他问题,例如"left"作为方向应该翻译,而不是动词"to leave"的过去式,即"I left it behind"不应该翻译成"I port it behind",那不是右舷吗?
一些没有代码的建议,因为我敢打赌您可以创建自己的代码并把它做好。 for 循环中的逻辑应包括:
- 将字符串拆分成白色 space -- 你这样做。我自己会添加通配符以允许一个或多个白色-space 字符,
token.split("\s+")
- 检查每个标记的末尾标点符号。 -- 有很多方法可以做到这一点,包括使用
token.charAt(token.length() - 1) == '.'
检查令牌中的最后一个字符,或者执行token.contains(".")
。如果您知道自己只会处理经期,那么这很容易做到。如果您可能有其他标点符号,这可能会变得更复杂。 - 删除并保存标点符号。如果你知道这只是一个时期,这很简单。如果可以是逗号或更多,这会变得有点复杂。
- 如果令牌是 HashMap 中的键,请将其替换为 HashMap 中的文本。你已经这样做了。
- 如果存在末尾标点符号,请将其重新添加并添加 "Arr"。
- 如果没有结尾标点符号,请添加 space。 " ".