配列のequals関数はインスタンスをチェックするだけなので、Setではうまく動作しません。 したがって、私はどのようにJavaで配列のセットを作るのだろうか?Javaで配列のセットを作る方法は?
オブジェクトに各配列を配置し、そのクラスに対してequals関数を実装する方法がありますが、パフォーマンスが低下することはありますか?
配列のequals関数はインスタンスをチェックするだけなので、Setではうまく動作しません。 したがって、私はどのようにJavaで配列のセットを作るのだろうか?Javaで配列のセットを作る方法は?
オブジェクトに各配列を配置し、そのクラスに対してequals関数を実装する方法がありますが、パフォーマンスが低下することはありますか?
、あなたはそれを拡張し、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;
}
}
Arrayを必要とする従来のAPIのために絶対に必要がない限り、生の配列は使用しないでください。
代わりに、タイプセーフであるArrayList<T>
を使用してください。これらの問題は発生しません。
+1ベストプラクティス。 –
Setを拡張し、equalsメソッドをオーバーライドするクラスがそれを実行できるクラス。
SetをTreeSetのインスタンスにすると、すべての比較(等価)に使用されるカスタムコンパレータを指定できます。
あなたの配列のラッパークラスを作成し、それに応じてハッシュコードとオーバーライドをオーバーライドできます。たとえば :ArrayListのクラスがすでに配列をラップしているので
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'も実装する必要があります。ツリーに基づいた実装を実装するには、何らかの並べ替えを実装する必要があります。 –
[マップでキーを配列にする方法]と密接に関連しています(http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) 。 – Raedwald