if (flipped.charAt(0) = "a" || "e" || "i" || "o" || "u"){
paren = "(" + flipped;
String firstpart = paren.substring(0,5);
String rest = paren.substring(5);
System.out.println(rest+firstpart);
}
在这段代码中,我想检查String翻转的第一个字符是否是元音。如果是,我在开头添加一个括号,并将前5个字符移动到字符串的末尾。 Eclipse给了我java.lang.NullPointerException
并说“分配的左侧必须是一个变量。”我该怎么做才能解决这个问题?
答案 0 :(得分:11)
您的代码存在以下问题,
==
语句处使用条件运算符=
而不是赋值if
。'
"
代替char
boolean isVowel(char ch){
ch=Character.toLowerCase(ch);
return ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u';
}
为元音检查制作单独的方法。
{{1}}
答案 1 :(得分:8)
我经常使用的另一个非常简单的解决方案:
if ("aeiou".indexOf(Character.toLowerCase(text.charAt(0))) >= 0) {
// text starts with vocal.
}
答案 2 :(得分:7)
您还可以使用正则表达式匹配:
if (text.matches("^[aeiou].*")) {
答案 3 :(得分:4)
使用包含所有这些值的集合。
Set<Character> myList = new HashSet<Character>(Arrays.asList('a', 'e', 'i', 'o', 'u'));
if(myList.contains(Character.toLowerCase(flipped.charAt(0)))) {
// Do work
}
这行代码(虽然错误:=
将分配,==
将进行比较)
if (flipped.charAt(0) == "a" || "e" || "i" || "o" || "u"){
将首先比较返回布尔值的flipped.charAt(0) == "a"
。然后它将继续boolean || "e" || "i" || "o" || "u"
。
boolean || "e"
不是有效代码。
答案 4 :(得分:0)
接受的答案虽然说明了问题,但并没有完全显示出他如何检查问题的解决方案。因此,我想我会显示一个更正的解决方案,并提供自己的解决方案。
不能理解布尔比较语法的人不会理解所有那些特殊的类。更不用说他可能没有的一些需求导入,现在将需要了解他为什么会出错。考虑到已经有5年了,我认为这个人已经解决了。.但是在evnet中,其他人甚至这个人仍然不确定某件事。
您的原始代码已更新(由于不知道它们的用途或准确性,我删除了其中的内容)。
char c = flipped.charAt(0);
if (c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' ||
c == 'I' || c == 'o' || c == 'O' || c == 'U' || c == 'u')
{
现在,这支持检查“ flipped.charAt(0)”是否等于元音天气的小写或大写。如您所见,我们通过检查“ C”是否等于其他值来对每种情况进行布尔检查。您只提供了一次检查,所以语法错误是因为您对非布尔值进行了布尔检查。当您在“ ||”旁边有值时它必须是“ false”,“ true”或“ SomethingA == SomethingB”。如果该对象是对象,则通常必须执行“ SomethingA.equals(SomethingB);例如,byte,int,short,long,float,double都可以正常工作,但是String需要第二种方法。
以下是一些技巧,可以进一步减少这种情况。
我们可以通过以下任何一种方法将char“ c”强制转换为小写。
char c = Character.toLowerCase(flipped.charAt(0));
或者我们可以采取更巧妙的方法。
char c = flipped.charAt(0) | 32;
这样,我们现在只需执行以下操作即可检查它是否是元音。
char c = flipped.charAt(0) | 32;
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' ||c == 'u')
{
但是我们可以更进一步。
我们可以进一步减少代码!
if (((1 << flipping.charAt(0)) & 2130466) != 0)
{
基本上,我的最终解决方案是如何工作的。不幸的是,它涉及到很多解释,但我会尽力而为。
在任何编程语言中,您都有Byte,Short,Int和Long的值,它们分别是8位,16位,32位和64位。
当您执行1 << N时,您正在执行2 ^ N,这基本上是两种方法的功效。事实是,当您在Byte,Short,Int或Long上使用它时,值“ N”会减少。
所以..(请记住,不同的语言对这些语言的处理方式不同)。
Byte can only range from 0-7.
Short can only range from 0-15.
Int can only range from 0-31.
Long can only range from 0-63.
因此,我们现在知道字母在我们执行1 <<字母时的值为AZ = 65-90和az = 97-122,实际上,它们将为1 <<(1-26),因为这些数字模或32的余数在两种情况下均为1-26。
您可以通过执行以下操作来查看。
A = 65.
65-32=33.
33-32=1. Stop.
所以现在我们知道在这种情况下A等于1。
所以现在我们做1 << 1或2 ^ 1 =2。所以字母A给我们的值是“ 2”。
对所有元音重复此操作,就可以求出位值的总和。位值只是两个相加的幂。我真的不能再努力解释这一点,但希望您有所想法。
现在,我们正在做的是获取元音位的总和,并将其与已经包含A,E,I,O,U的位值的数字2130466进行比较。如果我们检查的那些位值恰好在2130466中存在,那么它必须是A,E,I,O,U,因此它是元音。
返回结果为0或该值,因此我们只需检查该值不等于0。
请记住,如果有人使用此假设,则假定您知道字母将是A-Za-z情况,因为例如,如果它是“!”这将返回假阳性“ A”元音。您可以通过预先检查该值是否低于“ A”和高于“ u”并提前返回来解决此问题。