このJavaコードは私にトラブルを与えています:
String Word = <Uses an input>
int y = 3;
char z;
do {
z = Word.charAt(y);
if (z!='a' || z!='e' || z!='i' || z!='o' || z!='u')) {
for (int i = 0; i==y; i++) {
wordT = wordT + Word.charAt(i);
} break;
}
} while(true);
Wordの3番目の文字が非母音であるかどうかを確認し、そうである場合は、非母音とその前の文字を返します。母音の場合は、文字列内の次の文字をチェックし、母音でもある場合は、非母音が見つかるまで次の文字をチェックします。
例:
Word = Jaemeas、wordT must = Jaem
例2:
Word = Jaeoimus、wordT must = Jaeoim
問題は私のif
ステートメントにあり、その1行のすべての母音をチェックする方法がわかりません。
あなたの状態に欠陥があります。よりシンプルなバージョンを考えてください
z != 'a' || z != 'e'
z
が'a'
である場合、z
が'e'
ではないため(つまり、条件全体が真であるため)後半が真になり、z
が'e'
である場合、z
が'a'
ではないため前半が真になります(再び、条件全体が真です)。もちろん、z
が'a'
でも'e'
でもない場合、両方の部分が真になります。言い換えれば、あなたの状態は決して偽ではありません!
代わりに&&
sが必要になるでしょう:
z != 'a' && z != 'e' && ...
多分:
"aeiou".indexOf(z) < 0
母音をチェックするきれいな方法:
public static boolean isVowel(char c) {
return "AEIOUaeiou".indexOf(c) != -1;
}
正規表現を使用したアプローチはどうですか?適切なパターンを使用すると、グループを使用してMatcherオブジェクトから結果を取得できます。次のコードサンプルでは、m.group(1)の呼び出しは、パターンマッチがある限り、探している文字列を返します。
String wordT = null;
Pattern patternOne = Pattern.compile("^([\\w]{2}[AEIOUaeiou]*[^AEIOUaeiou]{1}).*");
Matcher m = patternOne.matcher("Jaemeas");
if (m.matches()) {
wordT = m.group(1);
}
同じ目標を達成するわずかに異なるアプローチ。
まず、文字が「not a」であるかどうかを確認していますOR "not e" OR "not i"など。
文字がiだとしましょう。その場合、文字はaではないため、「True」を返します。 i!= aであるため、ステートメント全体がTrueになります。あなたが探しているのは、ORそれらではなく、ステートメントをANDすることです。
これを行ったら、yを増分してこれを再度確認する方法を検討する必要があります。母音を初めて取得する場合、次の文字も母音であるかどうかを確認します。これは、位置y = 3の文字のみをチェックします。
実際にそれをチェックするためのはるかに効率的な方法がありますが、あなたの問題は何かを尋ねたので、問題はこれらのOR演算子をAND演算子で変更しなければならないことです。 ifステートメントを使用すると、常に真になります。
VOWELSのchar []定数を宣言し、charが母音かどうかをチェックするメソッドを実装しました(ブール値を返す)。私のメインメソッドでは、文字列を宣言し、それをcharsの配列に変換しているため、isVowelメソッドのパラメーターとしてchar配列のインデックスを渡すことができます。
public class FindVowelsInString {
static final char[] VOWELS = {'a', 'e', 'i', 'o', 'u'};
public static void main(String[] args) {
String str = "hello";
char[] array = str.toCharArray();
//Check with a consonant
boolean vowelChecker = FindVowelsInString.isVowel(array[0]);
System.out.println("Is this a character a vowel?" + vowelChecker);
//Check with a vowel
boolean vowelChecker2 = FindVowelsInString.isVowel(array[1]);
System.out.println("Is this a character a vowel?" + vowelChecker2);
}
private static boolean isVowel(char vowel) {
boolean isVowel = false;
for (int i = 0; i < FindVowelsInString.getVowel().length; i++) {
if (FindVowelsInString.getVowel()[i] == vowel) {
isVowel = true;
}
}
return isVowel;
}
public static char[] getVowel() {
return FindVowelsInString.VOWELS;
}
}
String Word="Jaemeas";
String wordT="";
int y=3;
char z;
do{
z=Word.charAt(y);
if(z!='a'&&z!='e'&&z!='i'&&z!='o'&&z!='u'&&y<Word.length()){
for(int i = 0; i<=y;i++){
wordT=wordT+Word.charAt(i);
}
break;
}
else{
y++;
}
}while(true);
これが私の答えです。
そのため、だれでもこれに出くわし、多くのシナリオで使用できる簡単な比較方法を求めています。
大文字でも小文字でも構いません。 A-Zおよびa-z。
bool vowel =((1 << letter)&2130466)!= 0;
これは私が考えることができる最も簡単な方法です。私はこれをC++と64ビットPCでテストしたので、結果は異なる可能性がありますが、基本的に「32ビット整数」で使用できるのは32ビットのみです。 「<<レター」。
ビットのしくみがわからない場合は申し訳ありませんが、深く掘り下げるつもりはありませんが、
1 << Nは2 ^ N乗または2の累乗と同じです。
したがって、1 << N&Xを実行するとき、Xに母音を作成する2のべき乗が含まれているかどうかをこの値2130466に配置します。結果が0でない場合は、母音でした。
この状況は、ビットを使用するあらゆるものに適用できます。この場合、値の範囲が0〜31である限り、インデックスの32より大きい値でも機能します。前述の文字のように、65〜90または97 -122ですが、残りが1〜26になるまで32を削除し続けます。残りは実際にはどのように機能するかではありませんが、プロセスのアイデアを提供します。
着信文字が保証されていない場合、その文字が「A」より下か「u」より上かどうかを確認するために留意する必要があります。とにかく結果は常に偽になるので。
たとえば、次の例は、偽母音の正を返します。 「!」感嘆符は値33で、「A」または「a」と同じビット値を提供します。