尝试分析字符串时程序冻结
Program freezes when trying to analyse a string
我正在编写一种方法,该方法应该分析用户给出的多项式(作为字符串)并在将来用它做不同的事情。目前,我正在尝试测试目前的代码,但每当我执行该程序时,它就会冻结,在电脑前坐了几个小时后,我仍然找不到其中的罪魁祸首。
我正在测试是否可以分析一个变量的多项式然后重新打印,但它不起作用。
我希望有人能帮我解决这个问题。
这是执行该方法的主要代码块,字符串 userInput 是一个多项式(例如 4x-6x^2):
String userInput = inputArea.getText().trim();
Monomials monomials = new Monomials();
monomials.analyse(userInput);
这是 class 单项式及其方法 analyse():
//Class Monomial
class Monomials
{
private int coeff = 0;
private char var;
private int addpow = 1;
private int pow;
private char powsign = '^';
private char minus = '-';
private boolean isnegative = false;
private String mono;
StringBuilder stringBuilder = new StringBuilder();
public int getCoeff(int coeff)
{
return coeff;
}
public void setCoeff(int coeff)
{
this.coeff = coeff;
}
public void setVar(char var)
{
this.var = var;
}
public void setPow(int pow)
{
this.pow = pow;
}
public String getMono(String monomials)
{
return mono;
}
// Method to further analyse user's input.
public void analyse(String polynomial)
{
//Split the poynomial into monomials and store them in an array list.
polynomial = polynomial.replaceAll("-","+-");
String polyParts[] = polynomial.split("\+");
ArrayList<String> monomials = new ArrayList<String>(Arrays.asList(polyParts));
// Iterate the monomials.
for (int i = 0; i <= monomials.size(); i++)
{
String monomial = monomials.get(i);
// Analyse the monomial.
for (int x = 0; x <= monomial.length(); x++)
{
char c = monomial.charAt(x);
int countcoeff = 0;
int countvar = 0;
// check if negative.
if (c == minus)
{
isnegative = true;
x++;
}
// get the coefficient.
if (Character.isDigit(c))
{
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
if (isnegative)
{
setCoeff(Integer.parseInt(monomial.substring(1, countcoeff)));
} else
{
setCoeff(Integer.parseInt(monomial.substring(0, countcoeff)));
}
}
// get the variable.
if (Character.isLetter(c))
{
char var = c;
while (Character.isLetter(var))
{
countvar++;
addpow++;
x++;
}
}
// get the power.
if (c == powsign)
{
countvar++;
x++;
while (Character.isDigit(c))
{
x++;
}
if (isnegative)
{
setPow(Integer.parseInt(monomial.substring(countcoeff+countvar+2, x)));
} else
{
setPow(Integer.parseInt(monomial.substring(countcoeff+countvar+1, x)));
}
pow += addpow;
}
}
if (isnegative)
{
stringBuilder.append(String.valueOf(minus));
}
stringBuilder.append(String.valueOf(coeff) + String.valueOf(var) + String.valueOf(powsign) + String.valueOf(pow));
mono = stringBuilder.toString();
monomials.set(i, mono);
}
for (int i = 0; i < monomials.size(); i++)
{
System.out.println(String.valueOf(monomials.get(i)));
}
} // End of method analyse().
} // End of class Monomial
你的循环之一是 运行 无限。您应该将其替换为 if 条件。
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
替换为
if (Character.isDigit(c))
{
countcoeff++;
x++;
}
或者你可以在这里使用 break 语句。
您有几个永远不会退出的循环:
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
如何找到这样的东西?
如果您使用 Eclipse,您可以 运行 调试模式下的代码,切换到调试透视图并单击黄色的挂起符号。这将暂停您的程序,在调试视图中您可以看到线程在哪一行 "hanging",如果您单击它,它将打开源代码。
如果您不使用具有该功能的 IDE,您可以使用 JDK-工具:使用 jps
找出程序的 ID:
C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jps
7216
5688 Jps
6248 Monomials
然后使用 jstack
打印所有 运行ning 线程的堆栈跟踪:
C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jstack 6248
[other threads omitted]
"main" #1 prio=5 os_prio=0 tid=0x000000000203e800 nid=0x1b2c runnable [0x000000000201e000]
java.lang.Thread.State: RUNNABLE
at Monomials.analyse(Monomials.java:77)
at Monomials.main(Monomials.java:10)
正如其他人所说
while (Character.isDigit(c))
是你的问题。
但是你有两次而不是一次,所以两次都是问题。第二个不是真正的问题,因为 Character.isDigit
和 if (c == powsign)
不能同时为真,所以第二个 init 循环永远不会执行,这让我想到了下一点:错误.
在你的代码中有大量的它们:-D
两个for循环都是运行far(<= .size() & <= .length()
),把<=换成<.
此外,放置在代码中的 x++ 是错误的。 x 自动递增,如果您想提前退出循环,请使用 break;
或如果您想提前跳到下一次迭代,请使用 continue;
。
我正在编写一种方法,该方法应该分析用户给出的多项式(作为字符串)并在将来用它做不同的事情。目前,我正在尝试测试目前的代码,但每当我执行该程序时,它就会冻结,在电脑前坐了几个小时后,我仍然找不到其中的罪魁祸首。
我正在测试是否可以分析一个变量的多项式然后重新打印,但它不起作用。
我希望有人能帮我解决这个问题。
这是执行该方法的主要代码块,字符串 userInput 是一个多项式(例如 4x-6x^2):
String userInput = inputArea.getText().trim();
Monomials monomials = new Monomials();
monomials.analyse(userInput);
这是 class 单项式及其方法 analyse():
//Class Monomial
class Monomials
{
private int coeff = 0;
private char var;
private int addpow = 1;
private int pow;
private char powsign = '^';
private char minus = '-';
private boolean isnegative = false;
private String mono;
StringBuilder stringBuilder = new StringBuilder();
public int getCoeff(int coeff)
{
return coeff;
}
public void setCoeff(int coeff)
{
this.coeff = coeff;
}
public void setVar(char var)
{
this.var = var;
}
public void setPow(int pow)
{
this.pow = pow;
}
public String getMono(String monomials)
{
return mono;
}
// Method to further analyse user's input.
public void analyse(String polynomial)
{
//Split the poynomial into monomials and store them in an array list.
polynomial = polynomial.replaceAll("-","+-");
String polyParts[] = polynomial.split("\+");
ArrayList<String> monomials = new ArrayList<String>(Arrays.asList(polyParts));
// Iterate the monomials.
for (int i = 0; i <= monomials.size(); i++)
{
String monomial = monomials.get(i);
// Analyse the monomial.
for (int x = 0; x <= monomial.length(); x++)
{
char c = monomial.charAt(x);
int countcoeff = 0;
int countvar = 0;
// check if negative.
if (c == minus)
{
isnegative = true;
x++;
}
// get the coefficient.
if (Character.isDigit(c))
{
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
if (isnegative)
{
setCoeff(Integer.parseInt(monomial.substring(1, countcoeff)));
} else
{
setCoeff(Integer.parseInt(monomial.substring(0, countcoeff)));
}
}
// get the variable.
if (Character.isLetter(c))
{
char var = c;
while (Character.isLetter(var))
{
countvar++;
addpow++;
x++;
}
}
// get the power.
if (c == powsign)
{
countvar++;
x++;
while (Character.isDigit(c))
{
x++;
}
if (isnegative)
{
setPow(Integer.parseInt(monomial.substring(countcoeff+countvar+2, x)));
} else
{
setPow(Integer.parseInt(monomial.substring(countcoeff+countvar+1, x)));
}
pow += addpow;
}
}
if (isnegative)
{
stringBuilder.append(String.valueOf(minus));
}
stringBuilder.append(String.valueOf(coeff) + String.valueOf(var) + String.valueOf(powsign) + String.valueOf(pow));
mono = stringBuilder.toString();
monomials.set(i, mono);
}
for (int i = 0; i < monomials.size(); i++)
{
System.out.println(String.valueOf(monomials.get(i)));
}
} // End of method analyse().
} // End of class Monomial
你的循环之一是 运行 无限。您应该将其替换为 if 条件。
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
替换为
if (Character.isDigit(c))
{
countcoeff++;
x++;
}
或者你可以在这里使用 break 语句。
您有几个永远不会退出的循环:
while (Character.isDigit(c))
{
countcoeff++;
x++;
}
如何找到这样的东西? 如果您使用 Eclipse,您可以 运行 调试模式下的代码,切换到调试透视图并单击黄色的挂起符号。这将暂停您的程序,在调试视图中您可以看到线程在哪一行 "hanging",如果您单击它,它将打开源代码。
如果您不使用具有该功能的 IDE,您可以使用 JDK-工具:使用 jps
找出程序的 ID:
C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jps
7216
5688 Jps
6248 Monomials
然后使用 jstack
打印所有 运行ning 线程的堆栈跟踪:
C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jstack 6248
[other threads omitted]
"main" #1 prio=5 os_prio=0 tid=0x000000000203e800 nid=0x1b2c runnable [0x000000000201e000]
java.lang.Thread.State: RUNNABLE
at Monomials.analyse(Monomials.java:77)
at Monomials.main(Monomials.java:10)
正如其他人所说
while (Character.isDigit(c))
是你的问题。
但是你有两次而不是一次,所以两次都是问题。第二个不是真正的问题,因为 Character.isDigit
和 if (c == powsign)
不能同时为真,所以第二个 init 循环永远不会执行,这让我想到了下一点:错误.
在你的代码中有大量的它们:-D
两个for循环都是运行far(<= .size() & <= .length()
),把<=换成<.
此外,放置在代码中的 x++ 是错误的。 x 自动递增,如果您想提前退出循环,请使用 break;
或如果您想提前跳到下一次迭代,请使用 continue;
。