2013-04-21 69 views
0

我有一个名为Polynomial的类,它由一个由名词对象组成的ArrayList,在我的测试类中有一个由Scanner对象读取的外部文件。扫描仪读取4个不同关键字的行并相应地执行操作。恩。 INSERT 3 2.将调用我的插入方法并打印出3x^2。现在我有一个带有两个参数的删除方法。当我在测试类中调用方法时,什么也没有发生,同样的事情被打印出来,没有任何东西被删除。我是否错过了一些东西,或者一起做错了吗?任何帮助是极大的赞赏。ArrayList不打印移除的对象

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 

编辑:这里是术语类别:

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

回答

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

我实际上已经尝试过'term.remove(new Term(coeff,expo));'但是没有任何东西在更新列表中被删除或替换。基本上我只是打印两次相同的列表。 – PeterLion 2013-04-21 23:20:13

+0

您必须重写Term类中的equals()方法。我保证它会起作用。 – Bohemian 2013-04-21 23:22:26

+0

'terms.equals(新术语(coeff,expo));'沿着这些线? – PeterLion 2013-04-21 23:23:31

0

您并未尝试从术语l中删除Term ist,而是试图去除系数和指数。

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

更糟糕的是,'List.remove(int index)'尝试去除列表的第index个元素。因此,如果列表的第二个元素的系数为5,那么最终会删除第五个项。请参阅http://docs.oracle.com/javase/6/docs/api/java/util/List.html#remove(int) – 2013-04-21 22:56:36

+0

正确,在这种情况下,结果将根本不是预期的结果。如果'current.getCoeff()'返回一个'int'或'current.getExpo()'返回一个'int',我希望至少可以看到一些'IndexOutOfBoundsException' – 2013-04-21 22:57:41

+0

是的,你是对的我会得到'IndexOutOfBoundsException's。我在智慧的最后。我觉得它很简单,但我无法得到它。 – PeterLion 2013-04-21 23:35:11

0

为什么你的删除方法采用参数coeff和expo .... ...它不会对它们做任何事情。

实际上,删除方法看起来很可疑。您需要更详细地了解术语数组的外观,现在它没有任何意义。

rolfl

+0

骨架类是p rovided,这是我的编程类,所以我无法对方法声明做任何更改。 – PeterLion 2013-04-21 23:03:45

+0

好吧,这是一个强烈的迹象表明,您的方法实现*需要*使用这两个参数。你的删除方法是错误的... – rolfl 2013-04-21 23:06:12

+0

我也尝试过'term.remove(新术语(coeff,expo));'和结果是一样的,没有任何反应。 – PeterLion 2013-04-21 23:22:25