私は、テキストファイルから文字列をインポートし、その文字列をスタックを使って分析し、特定の規則に適合しているかどうかに基づいて文字列がどの "言語"に属するかを判断するコードを書いています。以下のコードは、入力がパターン(A^nB ^)^ p(nは0以上)に続くかどうかを調べるためのテストです。私が書いたのは、AとBの最初のセットをスタックにロードし、次にAとBの2番目のセットを別のスタックにロードし、2つのスタックを同時にポップして戻り値を比較することです。一致した場合は、2つのスタックが同時に空になるまで(うまくいけば)、次にfalseを返すようにしてください。falseを返す必要がある場合にコードが真を返すのはなぜですか?
public static boolean checkL4(File file) throws IOException
{
Stack stack1 = new Stack();
Stack stack2 = new Stack();
Stack stack3 = new Stack();
boolean firstCompare = true;
boolean bStart = false;
char w = 0;
try (Scanner sc = new Scanner(file).useDelimiter("\\s*"))
{
while (sc.hasNext()){
w = sc.next().charAt(0);
if (w == 0) {
return true;
}
if (w != 'A' && w != 'B')
{
return false;
}
if (w == 'A') {
if(!bStart) {
stack1.push(w);
stack3.push(w);
}
if(bStart && stack2.isEmpty()) {
stack2.push(w);
} else {
if (firstCompare) {
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (!stack1.isEmpty() && stack2.isEmpty())
{
return true;
}
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
stack1.push(w);
firstCompare = false;
} else {
if(stack1.isEmpty()){
while (!stack3.isEmpty() || !stack2.isEmpty()) {
if (stack3.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack3.isEmpty()) {
return false;
} else {
if (stack3.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
if (stack3.isEmpty()){
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack1.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
}
}
}
if (w == 'B') {
bStart = true;
if(bStart && stack2.isEmpty()) {
stack2.push(w);
}
if(bStart && !stack2.isEmpty()) {
if (!stack1.isEmpty()) {
stack3.push(w);
}
if(!stack3.isEmpty()) {
stack1.push(w);
}
}
}
}
}
return false;
}
このコードは、ほとんどの入力(ABとAABBBAABBBのためにtrueを返し、そしてBBAAにfalseを返す)のために正しく動作しますが(ABBAとAABBCCDなど)、それはfalseを返す必要がありますいくつかのケースでは、それはtrueを返します。それで、回文であるケースや、非Aと非Bの文字があるケースでは、なぜそれが真に戻ってくるのですか?私は、w(入力)がAではなく、Bでなければfalseを返すというステートメントがそこにあることを知っています。これは私が書いた同様の方法で働いています。なぜこれはどうですか?また、2つの返された値が一致しない場合(入力が回文であれば)、falseを返すようにこれを書いています。
を使用して2つの文字列の間で比較すること.isEqualを使うべきだと思います。 – Andreas