Пользовательская реализация LinkedList для хранения терминов полинома - PullRequest
0 голосов
/ 18 ноября 2018

Для домашнего задания, над которым я работаю, необходимо создать пользовательскую структуру данных 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 Ответ

0 голосов
/ 18 ноября 2018

Вам не нужно 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] +"

...