2012-01-30 3 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입니다. 난 강력하게

public class Foo { 
    private int num; 
    private String letters; 
    private Date date; 
} 

는 그런 다음

0

내가 객체의 모든 데이터를 캡슐화 것이다 당신의 세트에서 예상되는 동작을 얻을 방법 equalshashCode를 오버라이드 (override) 할 수 있습니다 INT, 문자열 및 날짜 개체를 캡처하는 클래스를 만드는 것이 좋습니다 POJO에 배열.
POJO에서 자신의 과 같습니다. 예컨대 자바

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

배열은 예기치 않게 거짓 산출하여 (같은 길이와 동일한 요소와) 같은 내용으로 두 배열을 비교 hashCode()equals()를 대체하지 않습니다.

List<Object>을 사용하면 정상적으로 작동합니다. 당신은 Arrays.asList() 유틸리티를 이용할 수 있습니다.

1

TreeSet을 사용자 정의 Comparator으로 초기화하여 필요한 검사를 수행 할 수 있습니다. 배열과 기본 비교기로는이 작업을 수행 할 방법이 없습니다.

0

적절한 hashCode()equals()을 제공하는 Object[] 주위에가는 래퍼를 구현할 수 있습니다. 두 가지 방법은 아주 쉽게 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); 
    } 


}