ArrayList不会打印已删除的对象

时间:2013-04-21 22:46:48

标签: java arraylist java.util.scanner

我有一个名为Polynomial的类,其中一个ArrayList由term对象组成,有一个外部文件,由我的测试类中的Scanner对象读取。扫描仪读取4个不同关键词的行并相应地动作。恩。 INSERT 3 2.将调用我的插入方法并打印出3x ^ 2。现在我有一个带有两个参数的delete方法。当我在测试类中调用该方法时没有任何反应,同样的东西被打印出来并且没有被删除。我一起错过了什么或做错了吗?非常感谢任何帮助。

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类,并且有两种方法来获取系数和指数。

以下是我的测试类的片段:

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

编辑:这是Term类:

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

3 个答案:

答案 0 :(得分: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会越来越大,您的列表会越来越小。因此,当您删除最后一个术语(例如i = terms.size() - 1)时,列表中只剩下1个项目。如果您要删除所有项目,请考虑列表的clear方法。

答案 1 :(得分:0)

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

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

rolfl

答案 2 :(得分:0)

如果您的delete()方法试图删除具有指定系数的Twrm,我推荐以下内容:

  1. 如果参数是具有相同系数和指数的Term,则覆盖equals()方法返回true
  2. 覆盖hashCode()方法以基于相同的两个值返回哈希值
  3. 由于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;
    }