2013-12-10 75 views
0

新手java學生在這裏。我有一個ArrayList包含包含字符串和整數的對象。該對象的構造函數的結構如下MyClass(String, String, int, int, String)。我想在構造函數中使用String的第一個實例來查找ArrayList元素的索引,但是我很難理解如何去做。我試過使用indexOf(),但沒有成功找到特定元素的索引。如果有人會指出我正確的方向,我將不勝感激。乾杯獲取各種數據類型ArrayList的索引

回答

1

您必須覆蓋MyClass中的等於。 根據您想達到什麼樣的,你的equals方法看起來是這樣的:

public boolean equals(Object o) { 
    if (o== null) return false; 
    if (!(o instanceof MyClass)) return false; 
    MyClass other = (MyClass) o; 
    if (other.firstString != null && this.firstString != null 
    && this.firstString.equals(other.firstString) return true; 
    return false; 
} 

編輯:你應該重寫了hashCode爲好。重寫hashCode時,應考慮重寫equals時考慮的對象。所以,如果你測試相等對兩個MyClass的對象基於財產firstString,你應該inlcude firstString中的hashCode

public int hashCode() { 
    if (firstString == null) return 31; 
    return firstString.hashCode(); 

} 

EDIT2: 什麼ArrayList中,當你調用的indexOf基本上是這樣做: 「爲(Entry e = header.next; e!= header; e = e.next)if(o.equals(e.element)) return index; index ++; }'

因此,每次調用indexOf()時,ArrayList都會調用對象的equals方法。 因此,可以說,你有一個看起來像這樣的列表:

MyClass m1 = new MyClass("this is some random string", other params); 
MyClass m2 = new MyClass("this is my target string", other params); 
MyClass m3 = new MyClass("this is irrelevant", other params); 

list.add(m1); 
list.add(m2); 
list.add(m3); 

現在,你想知道一個包含「這是我的目標字符串」 MyClass的對象的索引。 所以你做出的indexOf一個電話:

list.indexOf(new MyClass("this is my target string"), other params); 

,並根據您的等於實現,它將返回1

+0

我正在查看教程,並試圖理清如何將其應用於獲取arraylist中特定元素的索引。 – Spud

+0

所以等於把這個和其他值進行比較並返回true或false。正確?哈希碼使用素數來確定結果是否等於1?我想,我還沒有真正想過。 – Spud

+1

當在集合中查找對象時,indexOf調用等於方法。如果您不覆蓋equals,則會通過比較對象的引用來測試對象是否相等。換句話說,只有當它們是SAME對象時,兩個對象纔會被視爲等於。 – Maggie

1

你必須看看如何覆蓋你的班級中的equalshashcode方法。這是Collection的api用來執行這種操作的東西。

-1

不要以爲你真的應該在列表中的離子來存儲不同類型如果你能避免它的第一個地方?你真的有一個具有不同類型屬性的對象列表嗎?

相關問題