Пользовательская реализация LinkedList для хранения терминов полинома
Для домашнего задания, над которым я работаю, вам необходимо создать собственную структуру данных LinkedList, которая будет содержать условия многочлена. У меня возникла проблема с моим конструктором, добавляющим термины в структуру данных, потому что он должен принять строку типа "5.2 3 2.1 2" (которая будет эквивалентна 5.2^3 + 2.1^2) и сохранить ее в моем пользовательском LinkedList. Некоторые требования включают, что термины не могут иметь нулевые коэффициенты, показатели должны быть целыми числами, а коэффициенты могут быть целыми или двойными. Когда я отслеживаю программу с помощью отладчика моей среды 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;
}
}`
1 ответ
Вы не должны 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]+"