由於數組中的等號函數只檢查實例,所以對於Set來說效果不佳。 因此,我不知道如何在java中創建一組數組?如何在java中創建一組數組?
一種可能的方式可以將每個數組放在一個對象中,併爲該類實現equals函數,但會降低性能嗎?
由於數組中的等號函數只檢查實例,所以對於Set來說效果不佳。 因此,我不知道如何在java中創建一組數組?如何在java中創建一組數組?
一種可能的方式可以將每個數組放在一個對象中,併爲該類實現equals函數,但會降低性能嗎?
由於ArrayList類已包裝的陣列,則可以延長它並覆蓋equals
和hashCode
方法。下面是一個示例:
public MyArrayList extends ArrayList<MyClass> {
@Override
public boolean equals(Object o) {
if (o instanceof MyArrayList) {
//place your comparison logic here
return true;
}
return false;
}
@Override
public int hashCode() {
//just a sample, you can place your own code
return super.hashCode();
}
}
UPDATE:
你甚至可以覆蓋它的一般用法,只是改變了代碼:
public MyArrayList<T> extends ArrayList<T> {
//overrides the methods you need
@Override
public boolean equals(Object o) {
if (o instanceof MyArrayList) {
//place your comparison logic here
return true;
}
return false;
}
}
不要使用原始數組,除非你絕對必須因爲一些需要數組的遺留API。
總是嘗試和使用類型安全ArrayList<T>
而不是你會有這些類型的問題。
+1爲最佳實踐。 – 2012-03-23 15:49:52
擴展Set和重寫equals方法的類可以做到這一點。
如果你使你的Set成爲TreeSet的一個實例,你可以指定一個用於所有比較(甚至相等)的自定義比較器。
您可以爲您的數組創建包裝類並覆蓋哈希碼並相應地等於。 例如:
public class MyArrayContainer {
int[] myArray = new int[100];
@Override
public boolean equals(Object other) {
if (null!= other && other instanceof MyArrayContainer){
MyArrayContainer o = (MyArrayContainer) other;
final int myLength = myArray.length;
if (o.myArray.length != myLength){
return false;
}
for (int i = 0; i < myLength; i++){
if (myArray[i] != o.myArray[i]){
return false;
}
}
return true;
}
return false;
}
@Override
public int hashCode() {
return myArray.length;
}
}
對於一組實現了基於哈希表,你也需要實現'hashCode'。對於基於樹的集合實現,您需要實現某種排序。 – 2012-03-23 15:29:26
與[如何使'Map'使用數組作爲鍵]密切相關(http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) 。 – Raedwald 2015-02-26 13:05:32