0

我有一个名为 Polynomial 的类,其 ArrayList 由术语对象组成,我的测试类中有一个由 Scanner 对象读取的外部文件。扫描器读取 4 个不同关键词的行并采取相应的行动。前任。INSERT 3 2. 调用我的插入方法并打印出 3x^2。现在我有一个带有两个参数的删除方法。当我在测试类中调用该方法时,什么也没有发生,同样的事情被打印出来并且没有被删除。我是错过了什么还是一起做错了?任何帮助是极大的赞赏。

public void delete (int coeff, int expo)
{
  for (int i = 0; i<terms.size(); i++)
  {
      Term current = terms.get(i);
      terms.remove(current.getCoeff());
      terms.remove(current.getExpo());
  }

}

我还有一个 Term 类,它创建一个 term 对象,并有两种方法来获取系数和指数。

这是我的测试类的片段:

public static void main(String[] args) throws IOException
{
    // TODO code application logic here
    Polynomial polyList = new Polynomial();



    Scanner inFile = new Scanner(new File("operations2.txt"));

    while(inFile.hasNext())
    {
       Scanner inLine = new Scanner(inFile.nextLine());

       String insert = inLine.next();

        if(insert.equals("INSERT"))
        {

           int coeff = inLine.nextInt();
           int expo = inLine.nextInt();            
           polyList.insert(coeff, expo);
        }
        if(insert.equals("DELETE"))
        {
            int coeff = inLine.nextInt();
            int expo = inLine.nextInt();
            polyList.delete(coeff, expo);
        }
    }
     System.out.println(polyList.toString());
   }
}

编辑:这是扫描仪类正在读取的 .txt 文件的示例:

INSERT 3 2
INSERT 4 4
INSERT 1 6
INSERT 2 0
INSERT 5 2
INSERT 6 3
PRODUCT
DELETE 3 2
INSERT 2 7
DELETE 4 4
INSERT 4 10

编辑:这是术语类:

class Term
{
//instance vars
private int coefficient;
private int exponent;


 public Term(int coeff, int expo)
 {
  coefficient = coeff;
  exponent = expo;

 }
 public int getCoeff()
 {
   return coefficient;
 }
 public int getExpo()
 {
   return exponent;
 }
 @Override
 public int hashCode()
 {
   return  coefficient + exponent;
 }

   @Override
   public boolean equals(Object o)
   {

     if (!(o instanceof Term))
     {
       return false;
     }
     Term t = (Term)o;
     return coefficient == t.coefficient && exponent == t.exponent;
   }
}
4

3 回答 3

0

您不是试图Term从术语列表中删除,而是试图删除系数和指数。

  for (int i = 0; i<terms.size(); i++)
  {
      Term current = terms.get(i); // Your list contains Term objects
      terms.remove(current.getCoeff()); // but you are try to removing a coefficient
      terms.remove(current.getExpo()); // and an exponent
  }

只是一般注意,删除这种方式将不起作用,因为i会越来越大,您的列表会越来越小。因此,当您删除最后一个术语(例如 where i = terms.size() - 1)时,列表中将只剩下 1 个项目。如果您尝试删除所有项目,请考虑列表的clear方法。

于 2013-04-21T22:53:04.773 回答
0

为什么您的 delete 方法采用参数 coeff 和 expo .... ...它对它们没有任何作用。

事实上,删除方法看起来很可疑。您将需要提供有关术语数组的更多详细信息,现在它没有任何意义。

滚滚

于 2013-04-21T22:58:16.873 回答
0

如果您的delete()方法试图删除具有指定系数的 Twrm,我建议如下:

  1. 如果参数是具有相同系数和指数的项,则覆盖equals()要返回的方法true
  2. 重写hashCode()方法以返回基于相同的两个值的哈希

由于该equals()方法应该进行比较,因此这样的实现是相当合理的。

完成此操作后,您的删除方法将变为一行:

terms.remove(new Term(coeff, expo));

实现应如下所示:

// in the Term class
@Override
public boolean equals(Object o) {
    if (!(o instanceof Term)
        return false;
    Term t = (Term)o;
    return coeff == t.coeff && expo == t.expo;
}

尽管重写该hashCode方法并不是使您的代码工作的严格要求,但这是一种很好的做法,所以这里有一个示例 impl:

@Override
public int hashCode() {
    return 31 * coeff + expo;
}
于 2013-04-21T23:05:14.123 回答