2012-03-23 68 views
0

由於數組中的等號函數只檢查實例,所以對於Set來說效果不佳。 因此,我不知道如何在java中創建一組數組?如何在java中創建一組數組?

一種可能的方式可以將每個數組放在一個對象中,併爲該類實現equals函數,但會降低性能嗎?

+0

對於一組實現了基於哈希表,你也需要實現'hashCode'。對於基於樹的集合實現,您需要實現某種排序。 – 2012-03-23 15:29:26

+0

與[如何使'Map'使用數組作爲鍵]密切相關(http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) 。 – Raedwald 2015-02-26 13:05:32

回答

-1

由於ArrayList類已包裝的陣列,則可以延長它並覆蓋equalshashCode方法。下面是一個示例:

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; 
    } 
} 
2

不要使用原始數組,除非你絕對必須因爲一些需要數組的遺留API。

總是嘗試和使用類型安全ArrayList<T>而不是你會有這些類型的問題。

+0

+1爲最佳實踐。 – 2012-03-23 15:49:52

-2

擴展Set和重寫equals方法的類可以做到這一點。

1

如果你使你的Set成爲TreeSet的一個實例,你可以指定一個用於所有比較(甚至相等)的自定義比較器。

0

您可以爲您的數組創建包裝類並覆蓋哈希碼並相應地等於。 例如:

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; 
} 
}