为什么我的代码在应该返回false的情况下返回true?

时间:2016-06-25 07:47:50

标签: java

我正在编写一个代码,它将从文本文件中导入一串字符,使用堆栈分析字符串,并根据它是否符合某些规则来确定字符串所属的“语言”。下面的代码测试输入是否遵循模式(A ^ nB ^)^ p(其中n大于或等于0)。我编写的方法是将第一组A和B加载到堆栈上,然后将第二组A和B加载到另一个堆栈上,同时弹出两个堆栈并比较返回的值。如果它们匹配,则继续(直到两个堆栈同时为空),如果它们没有,则返回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)但在某些情况下它应返回false(如ABBA和AABBCCD),它返回true。那么为什么对于回文案例和非A字母和非B字母的情况,它都会返回。我知道我在那里声明如果w(输入)不是和A而不是B,则返回false。这是用我写的类似方法工作的,为什么不用这个呢?如果两个返回的值不匹配,我也写了这个返回false(如果输入是回文,它们不应该返回)。

1 个答案:

答案 0 :(得分:0)

我认为您应该使用.isEqual来比较两个字符串而不是使用==