2010-06-07 71 views
2

我創建了一個Java堆棧並添加了一些自定義對象。這些對象包含唯一的ID作爲其字段之一。我需要根據唯一名稱獲取堆棧中該對象的索引。請找到例子。在堆棧中搜索

class TestVO{ 

private String name; 
private String uniqueId; 
//getters and setters 
} 
public class TestStack{ 
public static void main(String args[]){ 
    TestVO vo1=new TestVO(); 
TestVO vo2=new TestVO(); 
TestVO vo3=new TestVO(); 

vo1.setName("Test Name 1") 
vo1.setId("123") 

vo2.setName("Test name 2"); 
vo2.setId("234"); 

Stack<TestVO> stack=new Stack<TestVO>(); 
stack.add(vo1); 
stack.add(vo2); 

//I need to get the index of a VO from stack using it's unique ID 
} 

} 

有人可以幫我實施嗎?

+1

爲什麼你需要使用堆棧?一個堆棧不適合這個。這是功課嗎? – strager 2010-06-07 00:53:56

+1

我需要構建一個麪包屑導航。我認爲堆棧很方便。 – Apps 2010-06-07 01:01:34

回答

4

首先,實現hashCode和equals爲TestVO類方法:

class TestVO{ 

private String name; 
private String uniqueId; 

public boolean hashCode() { 
    if (uniqueId == null) return 0; 
    return uniqueId.hashCode(); 
} 

public boolean equals(Object o) { 
    if (o instanceof TestVO) { 
    TestVO other = (TestVO) o; 
    return o.uniqueId.equals(uniqueId); 
    } 
    return false; 
} 
//getters and setters 
} 

請注意equals方法,你應該添加額外的代碼檢查o.uniqueId不爲空。

現在你可以使用使用此代碼的UNIQUEID找到TestVO對象的索引:

int index = stack.indexOf(vo1); 
+0

+1'instanceof'操作符在'null'上返回'false',所以不需要顯式檢查:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20。 2 – trashgod 2010-06-07 01:31:59

+0

但o.uniqueId可能仍然爲空。 – Behrang 2010-06-07 01:35:46

+0

@Stephen C的回答有效解決了這個問題。 – trashgod 2010-06-07 04:08:54

2

對於Stack,您可以使用search方法。它會從堆棧頂部返回該對象的距離。希望這很好。您需要定義equals方法 - 這應該很簡單 - 只需在id字段上進行比較即可。

Java API Documentation

+0

非常感謝Daniel。請問我是否應該讓我知道,如果壓倒一切的等於方法,VO是最好的方法嗎?有沒有辦法在不修改VO代碼的情況下實現這一點? – Apps 2010-06-07 01:14:37

+0

我想如果你不能改變這個類,最好的選擇是創建一個子類並重寫equals方法。然後,當你推入堆棧時,你只需投射到新的子類(我認爲可行,最好自己嘗試!)。這個,或者只是在創建對象時使用新類。 – 2010-06-07 01:23:28

+0

@WPS:'search()使用'equals()'。 @Daniel:+1考慮引用更近的鏈接。 – trashgod 2010-06-07 01:34:13

2

如果你要立足的平等觀念在uniqueId場,那麼你或許應該採取措施確保該字段已正確初始化,並且該字段在初始化後不會更改。

如果您爲該字段提供了一個不受限制的setter,那麼在TestVO對象插入到集合或映射中後,如果某段代碼更改該字段,您將會遇到各種各樣的損壞行爲。