这是我以前的Java程序的更新版本,它要求用户提供一个句子,然后分离单词,然后将句子转换为Pig拉丁语。我以前的计划是可行的,但有一些推特需要做,这是我在收到积极反馈后做的。显然,我在separateWords函数中的循环是检查大写字母两次左右。我已经包括了指导书,供参考和同行编辑代码。谢谢。
例如,对于任务1中的结果字符串“停止并嗅到玫瑰”,Pig拉丁字符串应该是"topSay ndaay mellsay hetay osesray“要求:
public class Assignment9 {
public static void main(String[] args) {
// Variables
String sentence, revisedSentence;
// Create a Scanner object for keyboard input
Scanner keyboard = new Scanner(System.in);
// Get the input string
System.out.print("Enter sentence: ");
sentence = keyboard.nextLine();
//Close keyboard
keyboard.close();
// Call function to perform Task 1
revisedSentence = separateWords(sentence);
System.out.print("Revised Sentence: " +revisedSentence);
// Call function to perform Task 2
toPigLatin(revisedSentence);
}
private static String separateWords(String sentence)
{
// Variables
StringBuilder str = new StringBuilder(sentence);
int i = 1;
// While loop repeats until the end of the sentence
while (i < str.length())
{
// Checks for upper case characters
if(Character.isUpperCase(str.charAt(i)))
{
str.insert(i, ' ');
i++;
char ch = Character.toLowerCase(str.charAt(i));
str.setCharAt(i, ch);
}
i++;
}
return str.toString();
}
private static void toPigLatin(String revisedSentence)
{
// Variables
String latin = " ";
// Split sentence by spaces
String[] tokens = revisedSentence.split(" ");
// Convert English sentence into Pig Latin
for (int i = 0; i < tokens.length; i++)
{
// Get string from array
String str = tokens[i];
// Get first letter from string
String str1 = str.substring(0, 1);
// Get substring from string
String str2 = str.substring(1, str.length());
// Concatenate the two strings in a required format
str2 = str2.concat(str1);
// Concatenate the result and "AY"
str2 = str2.concat("ay");
// Make a sentence with all the words
latin = latin.concat(str2 + " ");
}
// Display pig latin verison
System.out.println("\nPig Latin Version:" +latin );
}
}发布于 2015-05-27 02:55:24
你的评论绝对是辱骂。这个特别漂亮..。以自己的方式:
//Close keyboard
keyboard.close();这些评论都没有用,因为:
请参阅这个美丽的答案中关于注释的具体内容--需要记住的两件事:
命名也不一致:
StringBuilder str = new StringBuilder(sentence);
String str = tokens[i]; 前者更好的名称可以是builder,而后者的有意义的名称可以是token。
评论不应取代有意义的名称:
// Get first letter from string
String str1 = str.substring(0, 1); 如果str1是firstLetter..。
发布于 2015-05-27 03:15:45
这可能看起来很琐碎,也许确实如此;但是,您不一致地使用两种缩进样式:
公共静态空主(String[] args) { //变量字符串语句,revisedSentence;
还有..。
私有静态字符串separateWords(字符串语句){ //变量StringBuilder str =新StringBuilder(语句);
最好坚持一种风格。在您的示例中,Java标准是第一个示例。
这些注释实际上是为了指出代码中的命名问题。在我看来,最明显的例子是:
//变量StringBuilder str =新的StringBuilder(句子);int = 1;// While循环一直重复到句子结束时(i < str.length())
好的命名会使这个评论变得不必要:
StringBuilder builder = new StringBuilder(sentence);
int i = 1;
while (i < builder.length())发布于 2015-05-27 04:12:34
separateWords()这种形式的循环…
int i= 1;while (i < str.length()) {…i++;}
…最好写成一个for循环。
这些评论是愚蠢的。如果你要写任何评论,写JavaDoc。
/**
* Transforms "StringsLikeThis" into "Strings like this".
*/
private static String separateWords(String interCaps)
{
StringBuilder s = new StringBuilder(interCaps);
for (int i = 1; i < s.length(); i++) {
if (Character.isUpperCase(s.charAt(i))) {
s.setCharAt(i, Character.toLowerCase(s.charAt(i)));
s.insert(i++, ' ');
}
}
return s.toString();
}toPigLatin()toPigLatin()函数在两方面比separateWords()更糟糕:
toPigLatin()打印它的输出而不是返回它,所以您将永远无法将它用于其他任何事情。您不能像对separateWords()的输出那样,将它的输出输入到另一个字符串转换函数中。您将无法使用它在一个程序的图形或网络界面。您将无法对该函数运行单元测试。StringBuilder。由于使用String连接,这里存在大量冗余复制。这个函数的输出在开头和结尾都有一个额外的空间。我会认为这是个虫子。
如果该句子包含两个连续空格,则在尝试从空单词中提取子字符串时,该函数将崩溃。
String.substring(index)的单参数形式自动将所有的内容都取到末尾。
private static String toPigLatin(String sentence) {
String[] words = sentence.split(" ");
StringBuilder latin = new StringBuilder(sentence.length() + words.length * "ay".length());
for (int i = 0; i < words.length; i++) {
if (i > 0) {
latin.append(' ');
}
String word = words[i];
if (!word.isEmpty()) {
char initial = word.charAt(0);
char remaining = word.substring(1);
latin.append(remaining).append(initial).append("ay");
}
}
return latin.toString();
}https://codereview.stackexchange.com/questions/87816
复制相似问题