这里的第一个问题尝试。在括号记录上尝试一些面试准备挑战 - 即:记录字符串的打开和关闭括号位置。我试图使用一个括号对象,然后在每个条目使用一个打开和关闭位置的单个数组。所有条件似乎都被捕获但是数组只是将最后的结果复制到数组中的所有条目。知道我做错了什么吗?已经将打印留给了我已尝试调试的屏幕,并且知道我到目前为止只考虑了我的算法的基本情况。提前谢谢。
class ParanthesisMatch {
static final char leftBracket = '(';
static final char rightBracket = ')';
public static void main(String[] args) {
String str = "(I (am (the) basic) case)";
char[] input = str.toCharArray();
int opens = 0;
int closes = 0;
int brackets = 0;
Bracket[] bracketArray = new Bracket[10];
System.out.println(input.length);
for (int i = 0; i < input.length; i++) {
System.out.println(input[i]);
if (input[i] == leftBracket) {
bracketArray[opens] = new Bracket();
System.out.println("Open trigger: " + i);
bracketArray[brackets].openBracket = i;
System.out.println("Open bracket is: " + bracketArray[opens].openBracket);
brackets++;
opens++;
}
if (input[i] == rightBracket) {
System.out.println("Close trigger: " + i);
bracketArray[brackets - closes].closeBracket = i;
System.out.println("Pos: " + (brackets - closes)
+ "Close bracket is: " + bracketArray[brackets - closes].closeBracket);
closes++;
}
}
for (int i = 0; i < brackets; i++) {
System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket);
}
}
}
class Bracket {
public static int openBracket;
public static int closeBracket;
Bracket() {
openBracket = 0;
closeBracket = 0;
}
public void setOpen(int open) {
this.openBracket = open;
}
public void setClose(int close) {
this.closeBracket = close;
}
}
更新 - 非常感谢你们。之后我发现了空指针异常错误,并且能够使用相同的更改来修复自己。静态提示非常适用于我对象的许多问题!基本情况((()))的工作代码,而不是嵌套(()())仍然是:
class ParanthesisMatch {
static final char leftBracket = '(';
static final char rightBracket = ')';
public static void main(String[] args) {
String str = "(I (am (the) basic) case)";
char[] input = str.toCharArray();
System.out.println(input.length);
int opens = 0;
int closes = 0;
int brackets = 0;
Bracket[] bracketArray = new Bracket[10];
for (int i = 0; i < input.length; i++) {
if (input[i] == leftBracket) {
bracketArray[opens] = new Bracket();
bracketArray[brackets].setOpen(i);
brackets++;
opens++;
}
if (input[i] == rightBracket) {
bracketArray[brackets - 1 - closes].setClose(i);
closes++;
}
}
System.out.println(input);
for (int i = 0; i < brackets; i++) {
System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket);
}
}
}
class Bracket {
public int openBracket;
public int closeBracket;
Bracket() {
openBracket = 0;
closeBracket = 0;
}
public void setOpen(int open) {
this.openBracket = open;
}
public void setClose(int close) {
this.closeBracket = close;
}
}
答案 0 :(得分:0)
您的代码有两个问题。
第一个问题出在您的Bracket
课程中:
class Bracket {
public static int openBracket;
public static int closeBracket;
您已将字段openBracket
和closeBracket
声明为static
,这意味着它们属于Bracket
类本身,而不是每个Bracket
对象创建。因此,每个字段只有一个副本,在Bracket
类及其所有实例之间共享。这解释了为什么最后为每个Bracket
显示相同的值。
但是,这不是唯一的问题。取走static
修饰符后,您会在此行中获得NullPointerException
:
bracketArray[brackets - closes].closeBracket = i;
原因是您正在访问数组中的错误条目。在失败时,brackets
为3,closes
为0,但bracketArray[3]
仍为null
。您希望在索引2处访问该条目,因此在您正在使用它的所有三个位置将brackets - closes
替换为brackets - closes - 1
。
将brackets - closes
替换为brackets - closes - 1
后,我就能成功运行您的代码。
我发现令人惊讶的是,从这两个字段中删除static
修饰符后出现了NullPointerException。我没有做任何其他修改,如果我重新引入static
修饰符,NullPointerException就会消失。事实证明,即使您有null
引用,您仍然可以调用static
方法并访问static
字段。例如,如果您将static
修饰符重新引入字段,则以下行不会抛出NullPointerException:
System.out.println(((Bracket) null).openBracket);