用于存储多项式项的自定义 LinkedList 实现
Custom LinkedList implementation to store terms of a polynomial
对于我正在处理的家庭作业,您需要创建一个自定义的 LinkedList 数据结构来保存多项式的项。我的构造函数向数据结构添加项时遇到问题,因为它需要接受像“5.2 3 2.1 2”这样的字符串(相当于 5.2^3 + 2.1^2)并存储它在我的自定义链表中。一些要求包括项的系数不能为零,指数必须是整数,系数可以是整数或双精度。当我使用 IDE 的调试器跟踪程序时,我看到的是,出于某种原因,有效系数被捕获在我用“#”标记的子句和对头的引用中我的列表(术语第一个变量)似乎没有从正确链接到它的输入字符串中获取其他变量。在此先感谢您提供的任何帮助,我们将不胜感激。有许多必需的方法,但这是我遇到的问题的相关代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Polynomial
{
// instance variables
private Term first;
private int numTerms;
/**
* Constructor for objects of class Polynomial
*/
public Polynomial(String s)
{
Pattern whiteSpace = Pattern.compile(" ");
String[] poly = whiteSpace.split(s);
double coefficient;
int exponent;
if(poly.length % 2 == 1) {
throw new IllegalArgumentException();
}
first = new Term(); // dummy variable so that checking the first term specially is unnecessary
for(int term = 0; term < poly.length; term += 2) {
if(poly[term].matches("[\-][0-9]||[0-9]||[0-9][\.][0-9]||[\-][0-9][\.][0-9]")) {
coefficient = Double.parseDouble(poly[term]);
if(poly[term + 1].matches("[0-9]")) {
exponent = Integer.parseInt(poly[term++]);
} else {
throw new IllegalArgumentException(); //#
}
numTerms++;
this.addTerm(coefficient, exponent);
}
}
}
public void addTerm(double coef, int exp)
{
if(coef == 0) {
throw new IllegalArgumentException();
}
Term pointer = first;
while(pointer.next != null) {
if(exp == pointer.next.exponent) {
if(coef + pointer.next.coefficient == 0) {
pointer.next = pointer.next.next;
numTerms--;
} else {
pointer.next.coefficient += coef;
break;
}
} else if(pointer.next.exponent < exp) {
Term newTerm = new Term(coef, exp, pointer.next.next);
pointer.next = newTerm;
numTerms++;
break;
}
pointer = pointer.next;
}
}
private class Term {
double coefficient;
int exponent;
Term next;
Term() {
next = null;
}
Term(double coef, int exp, Term nextTerm) {
coefficient = coef;
exponent = exp;
next = nextTerm;
}
}`
您不需要 regex
检查有效性 ParseXXX()
会处理这件事。如果解析失败,将抛出异常,然后您可以简单地 throw IllegalArgumentException
for (int term = 0; term < poly.length - 1; term += 2) {
try {
coefficient = Double.parseDouble(poly[term]);
exponent = Integer.parseInt(poly[term + 1]);
numTerms++;
this.addTerm(coefficient, exponent);
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}
此外,使用 regex
= "[0-9]" 意味着只有一位指数。您可能想将其更改为“[0-9]+”
对于我正在处理的家庭作业,您需要创建一个自定义的 LinkedList 数据结构来保存多项式的项。我的构造函数向数据结构添加项时遇到问题,因为它需要接受像“5.2 3 2.1 2”这样的字符串(相当于 5.2^3 + 2.1^2)并存储它在我的自定义链表中。一些要求包括项的系数不能为零,指数必须是整数,系数可以是整数或双精度。当我使用 IDE 的调试器跟踪程序时,我看到的是,出于某种原因,有效系数被捕获在我用“#”标记的子句和对头的引用中我的列表(术语第一个变量)似乎没有从正确链接到它的输入字符串中获取其他变量。在此先感谢您提供的任何帮助,我们将不胜感激。有许多必需的方法,但这是我遇到的问题的相关代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Polynomial
{
// instance variables
private Term first;
private int numTerms;
/**
* Constructor for objects of class Polynomial
*/
public Polynomial(String s)
{
Pattern whiteSpace = Pattern.compile(" ");
String[] poly = whiteSpace.split(s);
double coefficient;
int exponent;
if(poly.length % 2 == 1) {
throw new IllegalArgumentException();
}
first = new Term(); // dummy variable so that checking the first term specially is unnecessary
for(int term = 0; term < poly.length; term += 2) {
if(poly[term].matches("[\-][0-9]||[0-9]||[0-9][\.][0-9]||[\-][0-9][\.][0-9]")) {
coefficient = Double.parseDouble(poly[term]);
if(poly[term + 1].matches("[0-9]")) {
exponent = Integer.parseInt(poly[term++]);
} else {
throw new IllegalArgumentException(); //#
}
numTerms++;
this.addTerm(coefficient, exponent);
}
}
}
public void addTerm(double coef, int exp)
{
if(coef == 0) {
throw new IllegalArgumentException();
}
Term pointer = first;
while(pointer.next != null) {
if(exp == pointer.next.exponent) {
if(coef + pointer.next.coefficient == 0) {
pointer.next = pointer.next.next;
numTerms--;
} else {
pointer.next.coefficient += coef;
break;
}
} else if(pointer.next.exponent < exp) {
Term newTerm = new Term(coef, exp, pointer.next.next);
pointer.next = newTerm;
numTerms++;
break;
}
pointer = pointer.next;
}
}
private class Term {
double coefficient;
int exponent;
Term next;
Term() {
next = null;
}
Term(double coef, int exp, Term nextTerm) {
coefficient = coef;
exponent = exp;
next = nextTerm;
}
}`
您不需要 regex
检查有效性 ParseXXX()
会处理这件事。如果解析失败,将抛出异常,然后您可以简单地 throw IllegalArgumentException
for (int term = 0; term < poly.length - 1; term += 2) {
try {
coefficient = Double.parseDouble(poly[term]);
exponent = Integer.parseInt(poly[term + 1]);
numTerms++;
this.addTerm(coefficient, exponent);
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}
此外,使用 regex
= "[0-9]" 意味着只有一位指数。您可能想将其更改为“[0-9]+”