startsWith(String)方法和数组

4
我需要将一个字符串转换为piglatin。 piglatin有三个规则之一是:

如果英文单词以元音字母开头,则将英文单词 +“yay”返回为piglatin版本。

因此,我尝试这样做,老实说,我期望会出现错误,因为startsWith()方法需要一个字符串作为参数,而不是一个数组。

 public String pigLatinize(String p){
    if(pigLatRules(p) == 0){
        return p + "yay";
    }
}

public int pigLatRules(String r){
    String vowel[] = {"a","e","i","o","u","A","E","I","O","U"};
    if(r.startsWith(vowel)){
        return 0;
    }        
}

但如果我不能使用数组,我就必须像这样做:

if(r.startsWith("a")||r.startsWith("A")....);
     return 0;

我希望逐个测试每个元音字母(不包括y),这将占用大量空间,而且个人认为看起来会很乱。

当我写这篇文章时,我在考虑通过迭代对其进行测试。

 String vowel[] = new String[10];
 for(i = 0; i<vowel[]; i++){
     if(r.startsWith(vowel[i]){
         return 0;
     }

我不知道那个迭代尝试是否有意义。

你的第二种方法很好。有什么问题吗?只需将“i<vowel []”替换为“i<vowel.length”,它就可以正常工作了。并且String [] vowel = {"a", "A", "e", "E", "i", "I", "o", "O", "u", "U"}; - Ashwin
这个程序运行良好,但只有当我输入以"a"开头的字符串时才有效,而不是大写字母A或任何其他元音字母,它似乎只检查数组中的第一个字符串 :(。比如当我输入"are you"时,它返回"areyay youay",这是我期望的,但当我尝试输入"Is your"时,它返回了"Isay youray",而应该返回"Isyay youray"。 - user1793532
它对我来说运行良好。它将“Is”返回为“Isyay”。请在问题中发布您目前的代码。 - Ashwin
我已经修复了。public int pigLatRules(String r){ String[] vowel = {"a","A","e","E","i","I","o","O","u","U"}; for(int i=0; i基本上,如果没有break语句,它会继续循环并以else语句结束。至少我认为是这样,我在if/else中放了一个S.o.p的东西,它告诉我至少是这样。 - user1793532
我猜4个空格的缩进在注释中不起作用:\ - user1793532
一旦Java遇到return语句,控制权就会转移到“调用”语句的下一行。因此,一旦在for循环中遇到return 0,循环就不再继续了。但是很好,你已经找到了自己的解决方案,祝你在Java中好运:) - Ashwin
3个回答

2

您的代码:

String vowel[] = new String[10];
for(i = 0; i<vowel[]; i++){
    if(r.startsWith(vowel[i]){
        return 0;
     }
}

实际上已经非常接近一个可行的解决方案了(假设您确实在数组中放入了一些值)。

您需要在其中放入哪些值呢?正如您所提到的,您可以使用所有可能的元音值来填充数组。当然,这些值是:

String[] vowel={"a","A","e","E","i","I","o","O","u","U"};

现在你已经有了这个,你会想要循环(就像你计算出来的那样)遍历数组并进行检查:
public int pigLatRules(String r){
    final String[] vowels={"a","A","e","E","i","I","o","O","u","U"};
    for(int i = 0; i< vowels.length; i++){
        if(r.startsWith(vowels[i])){
             return 0;
         }
    }
    return 1;
}

不过,你可以对此进行一些改进。有些是最佳实践,有些只是选择,有些则是性能方面的。

至于最佳实践,你目前从该函数返回一个int。最好将该函数的结果更改为布尔值(如果你还没有遇到过它们,我建议你查找一下)。

至于选择,你说你不喜欢必须拥有一个包含大写和小写元音字母的数组。那么这里有一点信息。字符串有很多方法http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html,其中之一是toLowerCase(),它可以将整个字符串转换为小写。如果你将传递给函数的单词执行此操作,你需要检查的次数就会减半。

当然,还有很多其他方面可以涉及,但这只是一点点。


我在早些时候的帖子中评论了这个确切的信息,看起来它只检查数组的第一个值,即“a”,因为当我尝试“are you”时,它返回了“areyay youay”,这正是我期望和需要的结果,但是当我尝试大写字母A或任何其他元音字母时,例如“Is your”返回了“Isay youray”,而不是应该返回“Isyay youray”,似乎它只测试vowel [0]字符串,然后跳过其余部分,或者也许我不知道,这一切都非常令人困惑,我很惊讶自己在第一个迭代方法上就接近了正确答案。 - user1793532
我实际测试了我写的代码,它运行得很好,所以我很惊讶你遇到了任何问题。 - Paul Harris

1
将所有这些字符放入 HashSet 中,然后只需执行查找以查看字符是否有效,如果有效则返回 0。
请查看一些关于 HashSet 插入/查找的示例。这应该很简单。
希望这可以帮助到您。

0

将所有元音字母放入一个字符串中,获取要测试的单词的第一个字符,然后只需查看您的字符是否在所有元音字母的字符串中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接