Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java中的ArrayList按升序插入对象_Java_Netbeans_Arraylist_Sorting - Fatal编程技术网

用Java中的ArrayList按升序插入对象

用Java中的ArrayList按升序插入对象,java,netbeans,arraylist,sorting,Java,Netbeans,Arraylist,Sorting,所以我已经反复尝试了好几次不同的方法,但我似乎不知道该方法的合适算法。我正在创建一个多项式类,它使用一个数组列表,其中的项(int coeff,int expo)coeff是多项式的系数,expo是指数。在测试类中,我必须插入多个不同的术语对象,但它们需要按指数升序插入(例如,4x^1+2x^3+x^4+5x^7) 这是我在insert()方法末尾的代码,该方法使用两个参数,coeff和expo: public class Polynomial { private ArrayList&l

所以我已经反复尝试了好几次不同的方法,但我似乎不知道该方法的合适算法。我正在创建一个多项式类,它使用一个数组列表,其中的项(int coeff,int expo)coeff是多项式的系数,expo是指数。在测试类中,我必须插入多个不同的术语对象,但它们需要按指数升序插入(例如,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 ;
           }

    }

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

另外,我应该提到,我不允许使用任何其他集合或类,所以我必须使用for、if、else或do while语句来实现这一点。
提前谢谢

将其从for循环中删除:

       else if (expo > listTermExpo)
       {
             polynomials.add(newTerm);
             return;
       }
polynomials.add(newTerm);
return;
将其放置在for循环之后:

       else if (expo > listTermExpo)
       {
             polynomials.add(newTerm);
             return;
       }
polynomials.add(newTerm);
return;
推理:只有当该术语不小于列表中的任何术语(而不仅仅是第一个术语)时,才希望将其添加到列表的末尾


此外,它是很好的格式有;紧跟在语句后面的是for,中间没有空格,而()s中间没有空格。我已经编辑了从您那里复制的代码,以显示我的意思。

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

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

如果列表中已经有这样的术语,该算法将在第一个具有相同指数的术语前面添加新术语

总之,你要问的是如何对ArrayList进行排序,将系数最大的项放在ArrayList索引0处,第二大的项放在索引1处,等等?不,实际上相反,我想把指数最大的项放在ArrayList的末尾,指数最小的项放在ArrayList索引0处,系数与多项式的排序无关这解决了我的问题!我知道我让事情变得比需要的更复杂了。非常感谢:)明白了,感谢您的反馈!