2016-07-05 42 views
4

我期望在我的Set中只有2個元素,但打印時會收到3個元素!我如何定義唯一性?Java中自定義類的唯一值設置

public class test { 

    public static void main(String[] args) { 

     class bin { 
      int a; 
      int b; 
      bin (int a, int b){ 
       this.a=a; 
       this.b=b; 
      } 
      public boolean Equals(bin me) { 
       if(this.a==me.a && this.b==me.b) 
        return true; 
       else 
        return false; 
      } 
      @Override 
      public String toString() { 
       return a+" "+b; 
      } 
     } 

     Set<bin> q= new HashSet<bin>(); 
     q.add(new bin(11,23)); 
     q.add(new bin(11,23)); 
     q.add(new bin(44,25)); 

     System.out.println(q); 
    } 
} 
+0

你從未測試的唯一性印刷前 – Ibu

回答

4

這裏有兩個問題

  • equals應該是小寫並接受Object
  • 您必須覆蓋hashCode以及

修改後的代碼可能看起來像下面。請注意,這個實現並不完美,因爲在equals中,您應該檢查是否爲空以及是否可以進行類型轉換等。另外hashCode只是一個示例,但如何實現此類事情則是另一個主題。

import java.util.Set; 
import java.util.HashSet; 

public class test { 

    public static void main(String[] args) { 

     class bin{ 
      int a; 
      int b; 
      bin (int a, int b){ 
       this.a=a; 
       this.b=b; 
      } 

      @Override 
      public boolean equals(Object me) { 
       bin binMe = (bin)me; 
       if(this.a==binMe.a && this.b==binMe.b) 
        return true; 
       else 
        return false; 
      } 

      @Override 
      public int hashCode() { 
       return this.a + this.b; 
      } 

      @Override 
      public String toString() { 
       return a+" "+b; 
      } 
     } 

     Set<bin> q= new HashSet<bin>(); 
     q.add(new bin(11,24)); 
     q.add(new bin(11,24)); 
     q.add(new bin(10,25)); 
     q.add(new bin(44,25)); 

     System.out.println(q); 
    } 
} 

結果:

[11 24,10 25,44 25]