Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unique values of custom class in Java Set

Tags:

java

set

hashset

I expect to have only 2 elements in my Set but I receive 3 elements while printing! How can I define uniqueness?

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);
    }
}
like image 330
omid gholami Avatar asked Jul 05 '16 15:07

omid gholami


1 Answers

There are two issues here

  • equals should be lowercase and accept an Object
  • You have to override hashCode as well

The modified code could look like below. Note that the implementation is far from being perfect as in equals you should check for null and whether a type cast is possible etc. Also hashCode is just an example but how to implement such things is another topic.

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

Result:

[11 24, 10 25, 44 25]

like image 116
DAXaholic Avatar answered Oct 26 '22 15:10

DAXaholic