Java 我可以改进这台机器吗?
我是Java的新手,我为PigLatin做了一个小小的翻译Java 我可以改进这台机器吗?,java,string,substring,translation,Java,String,Substring,Translation,我是Java的新手,我为PigLatin做了一个小小的翻译 package stringmanipulation; public class PigLatinConverter { public String Convert(String word){ int position = 0; if (!IsVowel(word.charAt(0))) { for (int i= 0; i < word.length(); i++
package stringmanipulation;
public class PigLatinConverter {
public String Convert(String word){
int position = 0;
if (!IsVowel(word.charAt(0))) {
for (int i= 0; i < word.length(); i++) {
if (IsVowel(word.charAt(i))) {
position = i;
break;
}
}
String first = word.substring(position, word.length());
String second = word.substring(0, position) + "ay";
return first + second;
} else {
return word + "way";
}
}
public boolean IsVowel(char c){
if (c == 'a')
return true;
else if(c == 'e')
return true;
else if(c == 'i')
return true;
else if(c == 'o')
return true;
else if(c == 'u')
return true;
else
return false;
}
}
package;
公共级PIG转换器{
公共字符串转换(字符串字){
int位置=0;
if(!Is元音(word.charAt(0))){
for(int i=0;i
我能做些什么改进吗
在最新的Java版本中是否有我可能不知道的漂亮Java技巧?我是C#出身
谢谢大家! 严格来说,这并不是一种改进,但Java惯例规定方法应该以小写字母开头。我已经离开Java好几年了,但总的来说,您的代码看起来不错。如果你想挑剔,这里有一些评论:
- 添加评论。它不必遵循Javadoc规范,但至少要明确地描述接受的参数和预期的返回值,并可能给出一些关于其工作原理的提示(根据第一个字符是否为元音而不同)
- 您可能希望捕获
,我认为如果您传递一个长度为零的字符串,可能会发生这种情况IndexOutOfBoundsException
- 方法名称应为小写
可以重写is元音
等等。由于短路,在比较次数方面的性能应相似返回c=='a'| c=='e'
原音(char-ch)
改写如下:
return "aeiou".indexOf(ch) != -1;
我会写以下内容:
// String first = word.substring(position, word.length());
String first = word.substring(position);
我还将重命名方法名称以遵循编码约定
当然,作为我,我也会使用正则表达式而不是substring
和for
循环
System.out.println("string".replaceAll("([^aeiou]+)(.*)", "$2$1ay"));
// ingstray
工具书类
-
免责声明:我不懂Java
反向逻辑令人困惑,请将您的
语句写成如下内容:
if (IsVowel(word.charAt(0))) {
return word + "way";
} else {
for (int i= 0; i < word.length(); i++) {
// ...
return first + second;
}
这是家庭作业吗?如果是这样,请将其标记为这样
- 不清楚“诚实”或“镱”的预期行为
- 它不尊重大写字母(“Foo”应该变成“Oofay”,AEIOU也是元音)
- 如果传入空字符串,它将崩溃
如果您知道如何读取正则表达式,下面是一个完整的重写,可以使代码更具可读性:
String[] words =
"nix scram stupid beast dough happy question another if".split(" ");
for (String word : words) {
System.out.printf("%s -> %s%n", word,
("w" + word).replaceAll(
"w(qu|[^aeiou]+|(?<=(w)))([a-z]*)",
"$3-$1$2ay"
)
);
}
请注意,问题
变成了估计码头
,这是根据的正确翻译。事实上,上面的文字和翻译都是从文章中摘取的
正则表达式的工作方式如下:
return "aeiou".indexOf(ch) != -1;
- 首先,所有单词都以
w
作为前缀,以备不时之需
- 然后,跳过
w
,查找qu
或非空辅音序列。如果两者都找不到,那么实际单词以元音开头,因此使用捕获lookback抓取w
- 然后重新排列组件以获得翻译
即:
"skip" dummy w
|
w(qu|[^aeiou]+|(?<=(w)))([a-z]*) --> $3-$1$2ay
\ 2\_/ /\______/
\_________1_________/ 3
“跳过”虚拟w
|
w(qu |[^aeiou]+|(?$3-$1$2年)
\ 2\_/ /\______/
\_________1_________/ 3
工具书类
-
- 和
我知道这个问题已经有一年多的历史了,但我想我会对它进行修改。这段代码有几处改进
public String convert(String word)
{
int position = 0;
while(!isVowel(word.charAt(position)))
{
++position;
}
if(position == 0)
{
return word + "-way";
}
else if(word.charAt(0) == 'q')
{
++position;
}
return word.substring(position) + "-" + word.substring(0, position) + "ay";
}
public boolean isVowel(char character)
{
switch(character)
{
case 'a': case 'e': case 'i': case 'o': case 'u':
return true;
default:
return false;
}
}
首先,代码将找到第一个元音的位置,然后跳出循环。这比使用for循环遍历每个字母并使用break;跳出循环更简单。其次,这将匹配Wikipedia站点上的所有测试用例。最后,由于字符实际上是有限范围的int,因此可以使用switch语句用于提高性能和可读性。请不要删除piglatin标记,它与问题相关。我不同意,标记piglatin
完全不相关,但我会让您放心。这种类型的问题属于代码审查,piglatin标记与Apache Pig的语言层相关。通过阅读ag你会看到这与Java中的字符串操作无关。Sergio似乎是个C#家伙。憎恨者会讨厌的。我不讨厌,我真的想学Java。:)这是我一直在寻找的性感。我会测试它。编辑:我得到一个错误:必需:CharSequence Found:Char@Sergio:抱歉,请改用indexOf(char)
。+1表示“作为我,我也会使用regex”(当然还有其余的答案)。这让我笑了。我同意倒过来的逻辑。在我看来,while语句似乎有点复杂。@Sergio Tapia,Java可能有类似于.indexOf
的东西,它将回调作为参数(并且你会使用isvotal
作为回调),这将循环转换为调用和检查。我更喜欢“尽早返回”;缩进级别越高,代码越难阅读。显然,嵌套条件也是bug的主要来源。@tc.,虽然我同意,但我发现它更具个人风格,而不是那种目的。(请参阅:single-return
-per function Adverties。)大概就是这些人认为“goto”总是邪恶的,而我认为不必要地将流控制嵌入数据是邪恶的(这对编译器来说是一种优化的痛苦)。我开始在你的答案中看到ASCII艺术,这是一辆颠倒的卡车:)+1代表艺术。
public String convert(String word)
{
int position = 0;
while(!isVowel(word.charAt(position)))
{
++position;
}
if(position == 0)
{
return word + "-way";
}
else if(word.charAt(0) == 'q')
{
++position;
}
return word.substring(position) + "-" + word.substring(0, position) + "ay";
}
public boolean isVowel(char character)
{
switch(character)
{
case 'a': case 'e': case 'i': case 'o': case 'u':
return true;
default:
return false;
}
}