Когда я создаю второй новый класс Polynomial (связанный список), первый принимает значения второго - PullRequest
0 голосов
/ 17 февраля 2012
package polynomial;

/**
 *
 * @author Steven
 */

public class Polynomial
{
private float data;
protected static Polynomial head;
private Polynomial link;

/**
 * @param args the command line arguments
 */    
public Polynomial(float[] data)
{
    head = null;

    if(data.length == 1)
        head = insertAtFront(head, data[0]);

    for(int i = data.length-1; i >= 0; i--)
    {
        System.out.println(head);
        head = insertAtFront(head, data[i]);
    }
}

public Polynomial(float data, Polynomial link)
{
    this.link = link;
    this.data = data;
}

public static Polynomial add(Polynomial p, Polynomial p2)
{
    if(p.length() > p2.length())
    {
        while(p.length() != p2.length())
            {
                insertAtFront(p2, 0);
            }

        for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link)
        {
            p2.data = (p2.data + poly.data);
            p2 = p2.link;
        }
    }
    else if(p2.length() > p.length())
    {
        while(p2.length() != p.length())
            {
                insertAtFront(p, 0);
            }

        for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link)
        {
            p2.data = (p2.data + poly.data);
            p2 = p2.link;
        }
    }
    else
    {
        for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link)
        {
            p2.data = (p2.data + poly.data);
            p2 = p2.link;
        }
    }
    return p2.head;
}

public float evaluate(float x)
{
    int i = head.length()-1;
    float y = 0;
    for(Polynomial poly = head; poly != null; poly = poly.link)
    {
        if(poly.link == null)
            y += poly.data;
        else
            y += (poly.data * (float)(Math.pow(x, i)));
        i -= 1;
    }
    return y;
}

@Override
public String toString()
{
    int i = 1;
    String polyString = "blank";
    for(Polynomial poly = head; poly != null; poly = poly.link)
    {
        if(polyString.equalsIgnoreCase("blank"))
        {
            if(poly.data != 0)
                    polyString = poly.data + "x^" + (poly.length()-i) + " + ";
            else if(poly.data == 1)
                polyString = "x^" + (poly.length()-i) + " + ";
            else
                polyString = poly.data + "x^" + (poly.length()-i) + " + ";
        }
        else
        {
            if(poly.link == null)
            {
                if(poly.data != 0)
                    polyString = polyString + poly.data;
                else if(poly.data == 1)
                    polyString = polyString + "x";
                else
                    polyString = polyString + poly.data + "x^" + (poly.length()-i);
            }
            else
            {
                if(poly.data != 0)
                    polyString = polyString + poly.data + "x^" + (poly.length()-i) + " + ";
                else if(poly.data == 1)
                    polyString = polyString + "x^" + (poly.length()-i) + " + ";
                else
                    ;
            }
        }
        i = i + 1;
    }
    return polyString;
}

public int length()
{
    int answer = 0;

    for(Polynomial poly = head; poly != null; poly = poly.link)
    {
        answer++;
    }
    return answer;
}

private static Polynomial insertAtFront(Polynomial head, float data)
{
    return new Polynomial(data, head);
}

}

У меня есть второй класс, который является просто программой для запуска этих методов, и когда я создаю новый полином и запускаю связанные методы, кажется, что все работает успешно. После того, как я создаю новый полином, первый полином принимает значения второго. Я не понимаю 1. куда идут значения первого созданного полинома и 2. почему он вообще это делает.

1 Ответ

0 голосов
/ 17 февраля 2012
protected static Polynomial head;

ваш head объявлен как static - таким образом, существует только одна его копия для всех классов! Как только ваш второй Polynomial создан, он перекрывает голову первого.

Возможно, вы хотите, чтобы это была переменная экземпляра, а не переменная класса.
Хотя, выполнение этого также будет иметь свои собственные проблемы бесконечного рекурсивного вызова конструктора. Чтобы преодолеть его, вам может потребоваться другой класс, который содержит Polynomial head в качестве переменной экземпляра и инициализирует его только один раз для каждого списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...