使用Java中的ArrayList以升序插入对象

时间:2013-04-18 02:20:51

标签: java netbeans arraylist sorting

所以我来回尝试了多种不同的方法,但我似乎无法绕过适合此方法的算法。我正在创建一个使用ArrayList的Polynomial类,其中Term(int coeff,int expo)coeff是多项式的系数,expo是指数。在测试类中,我必须插入多个不同的Term对象,但它们需要按指数的升序插入(例如,4x ^ 1 + 2x ^ 3 + x ^ 4 + 5x ^ 7)

这是我在insert()方法结束时的代码,它接受两个参数:coeff和expo:

public class Polynomial
{

   private ArrayList<Term> polynomials ;

   /**
     * Creates a new Polynomial object with no terms
     */
  public Polynomial()
  {
       polynomials = new ArrayList<>() ;
  }

  /**
    * Inserts a new term into its proper place in a Polynomial
    * @param coeff the coefficient of the new term
    * @param expo the exponent of the new term
    */
   public void insert(int coeff, int expo)
   {

      Term newTerm = new Term (coeff, expo) ; 


      if (polynomials.isEmpty())
      {
          polynomials.add(newTerm);
          return;
      }


      int polySize = polynomials.size() - 1 ;


      for (int i = 0 ; i <= polySize ; i++)
      {
            Term listTerm = polynomials.get(i) ;  
            int listTermExpo = listTerm.getExpo() ;

            if ( expo <= listTermExpo )
            {
                 polynomials.add(i, newTerm);
                 return;
            }

            else if ( expo > listTermExpo )
           {
                 polynomials.add(newTerm) ;
                 return ;
           }

    }

}

问题出现在代码末尾附近。一旦我输入一个Term,其系数不是&lt; =索引处的Term,它将转到else if语句并将其添加到列表的末尾。这是错误的,因为它需要在JUST变得大于下一个系数的地方添加。仅仅因为它大于该系数并不意味着它是最大的系数。我已经尝试向后执行for语句:

for (i = polySize ; i >= 0 ; i--)
{
  etc.
}

但这不起作用,因为它反过来引发同样的问题。如果有人能提供一些解决方案或答案,我会非常感激,因为我很困惑。在这一点上,我确信我只是把它变得太复杂了。我只是想知道如何识别指数较大但后来回到for循环直到它小于或等于索引的指数。

另外,我应该提一下,我不允许使用任何其他集合或类,所以我必须使用for,if,else或do while语句来执行此操作。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

从for循环中删除它:

       else if (expo > listTermExpo)
       {
             polynomials.add(newTerm);
             return;
       }

在for循环后放置:

polynomials.add(newTerm);
return;

推理:您希望将术语添加到列表末尾,只要它不小于任何一个术语 - 而不仅仅是第一个术语。

此外,有良好的格式化;紧接在语句之后,它之间没有空格,并且()s在它们内部没有任何空格。我已经编辑了我从你那里复制的代码,以表明我的意思。

答案 1 :(得分:0)

这应该具有您指定的确切行为:

public void insert(int coeff, int expo) {
    Term newTerm = new Term(coeff, expo);
    int max = polynomials.size();
    int min = 0;
    int pivot;
    while (max > min) {
        pivot = (min + max) / 2;
        if (expo > polynomials.get(pivot).getExpo()){
            min = pivot + 1;
        }
        else {
            max = pivot;
        }
    }
    polynomials.add(min, newTerm);
}

如果列表中已有任何此类术语,则此算法将在第一个术语之前添加新术语,并使用相同的指数。