Для домашнего задания, над которым я работаю, вам необходимо создать настраиваемую структуру данных LinkedList для хранения условий полинома. В настоящий момент у меня возникла проблема с моим конструктором, добавляющим термины в структуру данных, потому что он должен принять строку типа «5.2 3 2.1 2» (что было бы эквивалентом 5.2 ^ 3 + 2.1 ^ 2) и сохранить ее. в моем настраиваемом списке LinkedList. Некоторые из требований включают в себя то, что члены не могут иметь нулевые коэффициенты, показатели должны быть целыми числами, а коэффициенты могут быть целыми или двойными. Когда я отслеживаю программу с помощью отладчика своей IDE, я заметил, что по какой-то причине действительные коэффициенты попадают в предложение, которое я пометил знаком «#» и ссылку на начало моего списка (сначала термин variable), похоже, не получает дополнительные переменные из введенной строки, связанной с ней должным образом. Любая помощь, которую вы можете оказать, будет очень признательна, заранее спасибо. Есть много обязательных методов, но это соответствующий код для проблемы, с которой я столкнулся:

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;
    }
}`
0
Rosa 18 Ноя 2018 в 09:44

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] +"

0
swayamraina 18 Ноя 2018 в 07:24