2017-10-07 48 views
1

我有這個類,它包含一個可包含CircleTriangle的組。努力理解圖中的等於組

public class FiguresGroup { 
private static final int NUM_FIGURES = 10; 
private Figure[] figuresList = new Figure[NUM_FIGURES]; 
private int numF = 0; 

public void add(Figure f) { figuresList[numF++] = f; } 

public String toString() { 
    String s = ""; 
    for (int i = 0; i < numF; i++) { 
     s += "\n" + figuresList[i]; 
    } 
    return s; 
} 

private boolean found(Figure f) { 
    for (int i = 0; i < numF; i++) { 
     if (figuresList[i].equals(f)) return true; 
    } 
    return false; 
} 

private boolean included(FiguresGroup g) { 
    for (int i = 0; i < g.numF; i++) { 
     if (!found(g.figuresList[i])) return false; 
    } 
    return true; 
} 

private boolean equals(FiguresGroup g) { 
    if (g.included(this) && this.included(g)) return true; 
} 

我不知道如何實施equals。我嘗試了你在這裏看到的,但它不起作用。 對於2個組相等,必須包含來自另一個的每個元素,反之亦然。如何使這項工作?

+0

'FigureGroup'會更具可讀性是正確的'hashCode'和'提供了參與類equals'實現。 – rkosegi

回答

0

您錯過了numF這兩個對象的條件, 和equals實現有編譯錯誤。

另請注意,found方法(取決於included)取決於Figure.equals的正確實施。 如果它的正確實施,那麼FiguresGroup.equals可能是固定的這樣:

private boolean equals(FiguresGroup g) { 
    return numF == g.numF && g.included(this) && this.included(g); 
    } 

此外,FiguresGroup.equals不會覆蓋Object.equals,這是令人困惑的。事實上,你可能已經對此感到困惑。當您在本課程以外撥打figuresGroup.equals時,代碼將編譯爲 ,即使此方法是私人的, ,因爲實際Object.equals將被調用而不是此私有方法。

您可以修復通過重寫Object.equals

@Override 
    public boolean equals(Object obj) { 
    if (!(obj instanceof FiguresGroup)) { 
     return false; 
    } 
    FiguresGroup other = (FiguresGroup) obj; 
    return numF == other.numF && other.included(this) && this.included(other); 
    } 
+0

我試過這個,但我在堆上創建了2個圖組(它們裏面沒有任何內容)並且嘗試了等號,但它返回false,知道爲什麼? –

+0

@ Mr.Vincent是的,看我更新的帖子 – janos

+0

好吧,但Figure.equals已經給我這樣了: –