2013-04-21 51 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