下面是检查匹配括号以查看它们是否正确嵌套的代码。看起来很简单,但我不明白为什么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;
}
}
}
}
答案 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;
答案 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