2012-01-30 4 views
2
List<Object> listObj = new ArrayList<Object[]>(); 
listObj.add(new Object[]{1,"abc",new Date(21/1/2001)}); 
listObj.add(new Object[]{1,"abc",new Date(21/1/2001)}); 
listObj.add(new Object[]{2,"acc",new Date(21/1/2001)}); 
Set<Object[]> unique = new HashSet<Object[]>(); 
unique.addAll(); 

に取得することを期待 - 私の検索:リストの一意のエントリ<Object[]>

代わり
{1,abc,21/1/2001},{2,acc,21/1/2001} 

を私が取得:

{1,abc,21/1/2001},{1,abc,(21/1/2001},{2,acc,21/1/2001} 

この例では一意のエントリを見つけるには?

+1

HashSetのは、 'Comparable'とは何の関係もありません。単に 'hashCode'と' equals'を使います。 –

答えて

6

Javaの配列には、これを機能させるための等価という概念はありません。あなたは、数字、文字列、日付を持つカスタムクラスを定義し、これを動作させるためにequals/hashCodeを実装する必要があります。

+0

これを行う正しい方法です。しかし、 'Map 'を使用し、 'Object []。toString()'をキーとして使用することもできます。配列の 'toString'には、配列のすべての要素(ポイントまで)が含まれているため、これがうまくいくと思います。これは「臭いのある」解決策であり、また「正しい」解決策は上に述べた解決策です。 –

0

最も簡単な方法はSetです。私は強く、私はオブジェクト内のすべてのデータをカプセル化するだろうそして、あなたがセット

0

から期待される動作を取得する方法equalshashCodeを上書きすることができ

、あなたのint型をキャプチャするためにクラスを作成
public class Foo { 
    private int num; 
    private String letters; 
    private Date date; 
} 

を文字列、日付オブジェクトをお勧めします配列をPOJOに渡します。
POJOでは、と同じ方法で定義できます。例えばJavaで

public class Bean { 
    private int i; 
    private String l; 
    private Date d; 
    public int getI() { 
     return i; 
    } 
    public void setI(int i) { 
     this.i = i; 
    } 
    public String getL() { 
     return l; 
    } 
    public void setL(String l) { 
     this.l = l; 
    } 
    public Date getD() { 
     return d; 
    } 
    public void setD(Date d) { 
     this.d = d; 
    } 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((d == null) ? 0 : d.hashCode()); 
     result = prime * result + i; 
     result = prime * result + ((l == null) ? 0 : l.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (!(obj instanceof Bean)) 
      return false; 
     Bean other = (Bean) obj; 
     if (d == null) { 
      if (other.d != null) 
       return false; 
     } else if (!d.equals(other.d)) 
      return false; 
     if (i != other.i) 
      return false; 
     if (l == null) { 
      if (other.l != null) 
       return false; 
     } else if (!l.equals(other.l)) 
      return false; 
     return true; 
    } 
} 
0

アレイが突然偽得、従って(同じ長さと等しい要素を有する)同じ内容を持つ2つの配列を比較hashCode()equals()を上書きしません。

List<Object>を使用する場合は正常に動作するはずです。あなたはArrays.asList()ユーティリティを利用することができます。

1

TreeSetは、必要なチェックを行うカスタムComparatorで初期化することができます。配列とデフォルトのコンパレータでこの作業を行う方法はありません。

0

Object[]の周りに適切なhashCode()equals()を提供する薄いラッパーを実装できます。二つの方法は非常に簡単にArrays.deepHashCode()Arrays.deepEquals()の観点で実施することができる。

public class Cmp { 

    public static class ObjArray { 
     private final Object[] arr; 
     public ObjArray(Object[] arr) { 
      this.arr = arr; 
     } 
     @Override 
     public int hashCode() { 
      return Arrays.deepHashCode(arr); 
     } 
     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      ObjArray other = (ObjArray)obj; 
      return Arrays.deepEquals(arr, other.arr); 
     } 
    } 

    public static void main(String args[]) { 
     List<ObjArray> listObj = new ArrayList<ObjArray>(); 
     listObj.add(new ObjArray(new Object[]{1,"abc",new Date(21/1/2001)})); 
     listObj.add(new ObjArray(new Object[]{1,"abc",new Date(21/1/2001)})); 
     listObj.add(new ObjArray(new Object[]{2,"acc",new Date(21/1/2001)})); 
     Set<ObjArray> unique = new HashSet<ObjArray>(); 
     unique.addAll(listObj); 
     System.out.println(unique); 
    } 


}