2016-09-28 6 views
1

Dies ist Teil einer Klasse ist, die ein Polynom Eingangsnummer speichern und auswerten Und hier ist die MethodeÜber den Ausdruck ein Polynom

public class Polynomial{ 
int coef,power; 

public Polynomial(int maxPower){ 
} 

public void setTerm(int coefficient, int power) { 
    this.coef = coefficient; 
    this.power = power; 
} 

Und die Eingangsparameter in main-Methode

public static void main(String[] args){ 
    Polynomial q = new Polynomial(2); 
    q.setTerm(2, 0); 
    q.setTerm(0, 1); 
    q.setTerm(3, 2); 
    System.out.println(q); 
} 

und es gibt eine Methode toString wie dies ich

public String toString(){ 
    return 
} 

aus dem Polynom Aussehen drucken ke pt begegnet dem Problem, dass die setTerm-Methode nur die letzten Eingabeparameter gelesen hat, nämlich q.setTerm (3,2), und ich denke, die ersten beiden wurden ersetzt. Was kann ich tun?

+2

Dies wird nicht funktionieren. Jedes Mal, wenn Sie setTerm aufrufen, überschreiben Sie die ältere. Ich schlage vor, dass Sie eine Liste/Karte von Koeff-Power-Paaren verwenden, um dieses Problem anzugehen. Definieren Sie im Wesentlichen einen Klassenbegriff, der Koeff und Macht als Mitglieder und eine Liste von Begriffen als Mitglied der Polynomialklasse enthält. –

+0

@ArunavSanyal: Das ist fast gut genug, um eine Antwort zu sein; Sie sollten in Betracht ziehen, Ihren Kommentar zu einem zu machen. – Makoto

+0

Ja, ich vereinfachte es ein wenig und legte die Antwort, –

Antwort

2

Also in Ihrem Beispiel müssen wir uns an die zuvor gesehenen Begriffe erinnern.

Ich werde es über eine Karte wie folgt tun.

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by arunavs on 9/28/16. 
*/ 
public class Polynomial { 

    // Key is power, value is coeff. 
    private Map<Integer, Integer> powerToCoeffMap = new HashMap<>(); 

    // Maximal power allowed for polynomial. 
    private int maxPower; 


    public Polynomial(int maxPower){ 
     this.maxPower = maxPower; 
    } 

    public void setTerm(int coefficient, int power) { 
     if (power > maxPower) { 
      // throw some exception here. 
     } 
     powerToCoeffMap.put(power, coefficient); 
    } 

    // terms may be rearranged in output. 
    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     powerToCoeffMap.forEach((power, coeff) -> {builder.append(coeff + "x^" + power+ " ");}); 
     return builder.toString(); 
    } 

     public static void main(String args[]) { 
      Polynomial q = new Polynomial(2); 
      q.setTerm(2, 0); 
      q.setTerm(0, 1); 
      q.setTerm(3, 2); 
     System.out.println(q); 
    } 
} 

Ausgänge: 2x^0 0x^1 3x^2

Ich hoffe, das hilft.

+1

Schön, wenn Sie eine Java 8-Lösung sehen, können Sie eine TreeMap verwenden, um nach Leistung sortiert zu werden. –

+0

Vielen Dank, es hilft wirklich. Ich lerne und versuche jetzt Map zu verwenden. – user6896477

1

Sie haben nur eine Coef und eine Power gespeichert. Am einfachsten ist es, ein Array von Koeffizienten zu haben, die nach Leistung indiziert sind.

public class Polynomial { 

    final int[] coefficients; 

    public Polynomial(int maxPower) { 
     coefficients = new int[maxPower + 1]; // All zero. 
    } 

    public void setTerm(int coefficient, int power) { 
     coefficients[power] = coefficient; 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = newStringBuilder(); 
     for (int power = 0; power < coefficients.length; ++power) { 
      if (coefficients[power] != 0) { 
       if (coefficients[power] > 0 && sb.length() > 0) { 
        sb.append('+'); 
       } 
       sb.append(coefficients[power]); 
       if (power > 0) { 
        sb.append('x'); 
        if (power > 1) { 
         sb.append('^').append(power); 
        } 
       } 
      } 
     } 
     return sb.toString(); 
    } 
} 
+0

Ich habe vorher versucht, Array zu verwenden. Es gab ein privates int [], das ich nicht hingelegt habe. Ich vermasselte es mit Macht und Koeffizient und konnte nie ein richtiges Array bekommen. Ihre Idee ist sehr klar und hilfreich, danke !! – user6896477

+0

Der Konstrukteur mit maxPower schien auf ein Array für Leistungen von 0 bis maxPower zu zielen. Andere Potenzen, negative und größere, sind nicht möglich, und das Array ist _sparse_, x^100 würde ein Array von 101 Einträgen benötigen. Der Kartentyp der Lösung ist allgemeiner (und etwas indirekter), benötigt aber keine maxPower. –

0

Eine weitere mögliche Implementierung mit der Möglichkeit, gleichzeitig mehrere Bedingungen der Ergänzung könnte wie folgt aussehen:

package de; 

import java.util.TreeMap; 

public class Polynomial { 
    //Private Fields 
    private TreeMap<Integer, Integer> polys = new TreeMap<>(); 

    public Polynomial() { 

    } 
    public Polynomial(int... args){ 
     if(args.length < 2) polys.put(0, args[0]); 

     for(int i= 0; i < args.length && i+1 < args.length; i = i+2){ 
      //      coeff      power 
     polys.put(Integer.valueOf(args[i+1]), Integer.valueOf(args[i])); 
     } 
     if((args.length % 2) != 0){ 
      polys.put(0, args[args.length-1]); 
     } 
    } 
    public void setTerm(int coeff, int power){ 
     polys.put(Integer.valueOf(power),Integer.valueOf(coeff)); 
    } 

    public void setTerms(int... args){ 
     if(args.length < 2) polys.put(0, args[0]); 

     for(int i= 0; i < args.length && i+1 < args.length; i = i+2){ 
      //      coeff      power 
     polys.put(Integer.valueOf(args[i+1]), Integer.valueOf(args[i])); 
     } 
     if((args.length % 2) != 0){ 
      polys.put(0, args[args.length-1]); 
     } 
    } 
    @Override 
    public String toString(){ 
     StringBuilder sb = new StringBuilder(); 
     for(Integer key : polys.descendingKeySet()){ 
      Integer value = polys.get(key); 
      if(value == 0) continue; 
      if(value > 0 && sb.length() != 0) sb.append("+"); 

      sb.append(value.toString()); 
      if(key == 1) sb.append("x"); 
      if(key > 1) sb.append("x^" + key); 

      } 
      return sb.toString(); 
     } 


    public static void main(String[] args) { 
     Polynomial p = new Polynomial(1, 1, -2, 2, -3, 3, 7, 0); 
     p.setTerm(17, 5); 
     p.setTerms(23, 4, 0, 6); 
     System.out.println(p.toString()); 
    } 
} 

Ausgang: 17x^5 + 23x^4-3x^3-2x^2 + 1x + 7

Es wird von der höchsten Potenz zur niedrigsten Potenz geordert, druckt x anstelle von x^1 und druckt nicht x^0.

+0

Ich verstehe deine Idee. Obwohl es ein Polynom gibt, das in mir ausgedruckt werden kann, aber es gibt mehr Werbung, die ich nicht aufgesetzt habe, weil ich ursprünglich versucht habe, einige Ideen zu bekommen, was ich tun kann, anstatt nur die ganzen Lösungen von allem zu betrachten. Obwohl ich denke, dass ich basierend auf deinem ändern kann. Trotzdem vielen Dank. – user6896477

+0

@ user6896477 Wenn Sie eine Lösung gefunden haben, die Ihnen gefällt, sollten Sie diese Antwort akzeptieren, damit andere Leute, die diesen Beitrag sehen, wissen, dass Sie eine Lösung gefunden haben und dass es eine Lösung gibt. –