2011-11-27 89 views
0

我有一個名爲Paragens這樣的類:的Java看看ArrayList包含字符串

public class Paragens { 
    static int contadorParagens = 1; 

    String nomeParagem; 
    int id; 

    public Paragens(String nomeParagem) { 
     this.nomeParagem = nomeParagem; 
     this.id = contadorParagens++; 
    } 

    // getters and setters for nomeParagem 
} 

每個Paragens對象都有一個名稱和ID。

這個類,我創建幾個Paragens對象,並將它們存儲這樣一個ArrayList內的主要方法:

public static void main(String[] args) { 
    ArrayList<Paragens> paragens = new ArrayList<Paragens>(); 
    paragens.add(new Paragens("name1"); 
    // ... add more paragens 
} 

這是工作確定。如果我插入一串白細胞並打印它們,我可以看到達到一切都好。

我想要做的是要求用戶輸入一個paragem名稱,然後我想看看如果該paragem已經在ArrayList中。

String name; 
System.out.println("Insert paragem name: "); 
pickName = sc.nextLine(); 
System.out.println(paragens.contains(pickName)); 

我在做什麼錯?

回答

10

contains檢查列表是否包含您交給它的實際內容。在這種情況下,您傳遞String名稱,但將其與Paragem實例進行比較。 contains不能奇蹟般地猜測它應該查看Paragem實例上的給定屬性來比較字符串。

您可以輕鬆地循環列表,找出自己:

boolean found = false; 
for (Paragem p : paragems) { 
    if (p.nomeParagem.equals(pickName)) { // Or use an accessor function for `nomeParagem` if appropriate 
     found = true; 
     break; 
    } 
} 

...或者作爲一個函數:

boolean containsParagemWithName(ArrayList<Paragem> paragems, String pickName) { 
    for (Paragem p : paragems) { 
     if (p.nomeParagem.equals(pickName)) { 
      return true; 
     } 
    } 
    return false; 
} 
+3

或覆蓋'equals' –

+0

如果你將它變成了它自己的方法,你可以不用'found'標誌,只需在循環中返回true或者在返回後返回false。 – Thilo

+3

@Anonymouse:不要重寫equals來使Paragem等於一個String。那將是*非常規的(例如,平等將不再是對稱的)。 Equals,hashCode和這些方法是非常通用的,期望遵循某些合同,並且不應該做出意想不到的事情來適應某些特殊的目的。 – Thilo

1

那麼,你需要自己實現contains方法。對整個數組執行for循環,並檢查其中一個元素的名稱是否與您要添加的元素的名稱相同。如果不是,請添加一個new Paragens(pickName)

+0

'contains'方法沒有問題。他只需要實現'equals'或者手動檢查循環中的實例。 –

1

默認情況下,對象將通過它們的內存位置進行比較。所以如果你有兩個同名的Paragem,它們仍然不相等。

因此,要麼,你檢查每個人的名字:

boolean checkDuplicate(String pickName) { 
    for (Paragem p : paragems) { 
     if (p.nomeParagem.equals(pickName)) return true; 
    } 
    return false; 
} 

或實施(重寫)equals方法來比較名稱(應新Paragem對象上調用contains然後代替String,雖然)。

+0

*「默認情況下,對象會根據其內存位置進行比較,所以如果您有兩個同名的Paragem,它們仍然不相等。」*是,但不是*比較兩個Paragem實例。他將'String'與'Paragem'進行比較。 –

+0

@ T.J。克勞德:正確。這就是爲什麼它更少工作。 ;-)不幸的是,Java Collections中的'contains'是爲'Object'定義的,它引入了這種類型的錯誤。 –

+0

理解了for循環,但最後一件事(實現(重寫)equals方法來比較名稱。)不明白,因爲我是Java新手。不過將實現for循環 – Favolas

相關問題