循环没有重置?

时间:2013-07-17 16:51:14

标签: java loops

下面是检查匹配括号以查看它们是否正确嵌套的代码。看起来很简单,但我不明白为什么i一旦找到嵌套匹配就不会重置为0。任何指导都将非常感谢。

    String testString = "{}()[] ";
    char [] openParenthesis = {'(','{','['};
    char [] closeParenthesis = {')','}',']'};

    ArrayList<Character> characterList = new ArrayList<Character>();
    for(char c : testString.toCharArray())
    {
        characterList.add(c);
        System.out.println("This is what is added to the list Arraylist: " + c);
    }

    System.out.println();


for(int i = 0; i < characterList.size()-1; i++)
            {
                System.out.println("1st Loop: " +characterList.get(i));
                System.out.println("1st Loop: " + characterList.get(i + 1));
                System.out.println("1st Loop: " + i);
                System.out.println();

                for(int j = 0; j < openParenthesis.length; j++)
                {
                    if (characterList.get(i) == openParenthesis[j])
                    {
                        if(characterList.get(i + 1) == closeParenthesis[j])
                        {
                            System.out.println("Nested Match");
                            System.out.println(characterList.get(i));
                            System.out.println(characterList.get(i + 1));
                            System.out.println();
                            characterList.remove(i);
                            characterList.remove(i + 1);
                            i = 0;
                        }
                    }   
                }
        }

6 个答案:

答案 0 :(得分:2)

首先,你要删除ArrayList中的错误位置。

因为它是一个ArrayList characterList.remove(i);会将所有内容移到左边的一个位置,所以下一个像characterList.remove(i+1);移除了你想要的位置右边的那个。

您还需要在openParenthesis循环中添加一个中断,以便在找到匹配项时可以在数组的开头搜索。

您还需要将i = 0更改为i = -1,因为它会在开始for循环的下一次迭代之前将其增加到一个。

最后,您应该使用.equals()而不是==,因为ArrayList会返回Character个对象而不是char

以下是我提出的建议:

for (int i = 0; i < characterList.size() - 1; i++) {
        System.out.println("1st Loop: " + characterList.get(i));
        System.out.println("1st Loop: " + characterList.get(i + 1));
        System.out.println("1st Loop: " + i);
        System.out.println();

        for (int j = 0; j < openParenthesis.length; j++) {
            if (characterList.get(i).equals(openParenthesis[j])) {
                if (characterList.get(i + 1).equals(closeParenthesis[j])) {
                    System.out.println("Nested Match");
                    System.out.println(characterList.get(i));
                    System.out.println(characterList.get(i + 1));
                    System.out.println();
                    characterList.remove(i);
                    characterList.remove(i);
                    i = -1;
                    break;
                }
            }
        }
    }

此代码已修复上述所有错误,应正确运行。

答案 1 :(得分:1)

这取决于你testString的内容。我使用值foo()对其进行了测试,并且循环确实进入了if(characterList.get(i + 1) == closeParenthesis[j])条件。

但是您的代码中存在以下问题:

characterList.remove(i);
characterList.remove(i + 1);

由于java.lang.IndexOutOfBoundsException位置在删除i+1元素后变为无效(超出范围),因此会导致 ith 。它应该是另一种方式:

characterList.remove(i + 1);
characterList.remove(i);

而不是i=0;,您需要将其设置为:i = -1;

更重要的是通过调用break来突破内部for循环。

所以你的代码最终应该是这样的:

i = -1;
break;

参见工作演示:http://ideone.com/DfGJ2m

答案 2 :(得分:1)

显然是因为for循环i中的i ++等于1。如果你真的想再次为0设置i。使用i=-1;

答案 3 :(得分:1)

在循环体完成后,你的for循环将i增加一个。

因此,您设置i=0,退出循环体,调用i++,然后使用i ==1再次进入循环体。

答案 4 :(得分:1)

我猜你可以使用堆栈数据结构并使用类似于http://www.geeksforgeeks.org/check-for-balanced-parentheses-in-an-expression/

的过程

答案 5 :(得分:0)

当您将字符存储在列表中时,java会将其自动转换为字符。您不能使用==运算符来比较两个字符的相等性,但必须使用.equals()方法,如此代码所示:

  Character aOne = new Character('a');
  Character aTwo = new Character('a');

  if(aOne == aTwo)
  {
     System.out.println("aOne and aTwo == operator says they are equal");
  }
  else
  {
     System.out.println("aOne and aTwo == operator says they are NOT equal");
  }

  if(aOne.equals(aTwo))
  {
     System.out.println("aOne and aTwo .equals operator says they are equal");
  }

代码打印出来:

aOne and aTwo == operator says they are NOT equal
aOne and aTwo .equals operator says they are equal