2016-09-28 87 views
1

这是存储和计算的输入数字 多项式这里一类的部分是方法关于打印出一个多项式

public class Polynomial{ 
int coef,power; 

public Polynomial(int maxPower){ 
} 

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

而且在main方法的输入参数

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); 
} 

并且有一个toString方法来打印出多项式如下所示

public String toString(){ 
    return 
} 

I ke pt遇到了setTerm方法只读取最后一个输入参数q.setTerm(3,2)的问题,并且我认为前两个参数已被替换。我能做什么?

+2

这不会工作。每次调用setTerm时,都会覆盖旧的。我建议你使用coeff-power对的List/Map来解决这个问题。基本上定义一个包含coeff和权力作为成员的类Term和作为Polynomial类成员的一个Terms of List。 –

+0

@ArunavSanyal:这几乎足以成为一个答案;你应该考虑让你的评论之一。 – Makoto

+0

是的,我简化了一点,并把答案, –

回答

2

所以在你的例子中,我们必须记住先前看到的术语。

我会通过如下地图做到这一点。

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); 
    } 
} 

输出:2X^0^0X 1 3倍^ 2

我希望这有助于。

+1

很高兴看到一个java 8解决方案,你可以使用一个TreeMap按照权力排序。 –

+0

非常感谢,它确实有帮助。我正在学习并尝试使用Map。 – user6896477

1

您只存储一个coef和一个权力。 最简单的是有一个由权力索引的系数阵列。

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

我也尝试过使用数组。有一个我没有提出的私人诠释术语[]。我把它与功率和系数混淆在一起,永远无法得到一个正确的数组。你的想法非常清楚和有益,谢谢! – user6896477

+0

带有maxPower的构造函数似乎瞄准了从0到maxPower的一个数组。其他权力,负面和更大的是不可能的,并且数组是_sparse_,x^100将需要101个条目的数组。解决方案的地图类型更通用(并且更加间接),但不需要maxPower。 –

0

另一个可能的实现与一次添加多个术语的可能性可能看起来像这样:

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()); 
    } 
} 

输出:17X^5 + 23X^4-3x^3-2x^2 + 1×+ 7

它从最高功率到最低功率订购,打印x而不是x^1并且不打印x^0。

+0

我明白你的想法。虽然在我的问题中有一个多项式可以打印出来,但是我没有提出更多的广告,因为我原本试图了解我可以做什么,而不是从所有人的角度看整个解决方案。虽然我认为我可以根据你的修改。还是非常感谢你。 – user6896477

+0

@ user6896477如果您找到了您喜欢的解决方案,请考虑接受该答案,以便查看此帖的其他人知道您找到了解决方案并且有解决方案。 –