Granny's Programming Pearls
"inside of every large program is a small program struggling to get out"
JavaRanch.com/granny.jsp
The moose likes Beginning Java and the fly likes non duplicates in a Set Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "non duplicates in a Set " Watch "non duplicates in a Set " New topic
Author

non duplicates in a Set

Rob McBryde
Greenhorn

Joined: Dec 18, 2010
Posts: 16
Hi All,

I am in the process of writing a small program where I have created a very simple class called Vertex that has a String as a field. I am now attempting to add a number of instances of my Vertex class into a HashSet. However, my resultant HashSet has duplicates in it.

I have added a equals method and compareTo method in my Vertex class to attempt to allow my HashSet to uniquely identify Vertexes but I am clearly missing something. Can anyone point me in the right direction. Do I need to override the HashCode in my Vertex class?








This results in a Set of [A, B, A, C] when I would like to have no duplicates, hence my choice in using a Set.

Thanks in advance
Matthew Brown
Bartender

Joined: Apr 06, 2010
Posts: 4344
    
    8

Rob McBryde wrote:Do I need to override the HashCode in my Vertex class?

Yes, that's it. You should always override hashCode() whenever you override equals(), as they should be consistent with each other (see the contract descriptions in the Javadocs for Object). HashSet relies on hashCode() working correctly (the "Hash" in the name is not a coincidence!).
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19656
    
  18

And your equals method has a huge bug. If you pass null or an instance of an incompatible class the method should return false. Your implementation will throw a NullPointerException / ClassCastException.


SCJP 1.4 - SCJP 6 - SCWCD 5 - OCEEJBD 6
How To Ask Questions How To Answer Questions
Stephan van Hulst
Bartender

Joined: Sep 20, 2010
Posts: 3605
    
  14

Not only is it bugged, it uses a poor construct:
Rob McBryde
Greenhorn

Joined: Dec 18, 2010
Posts: 16
Thanks for the advice, I have re-written my equals method and overridden the hashCode() method within my Vector class. Have tested this and no duplicate Vectors are being added to my HashSet. Hurray!






I appreciate the comments, a little unsure about Stephan's comment about the poor construct of my initial equals method. Would you be able to further advise why it is poor and what I should be doing to improve it ?

Thanks
Paul Beckett
Ranch Hand

Joined: Jun 14, 2008
Posts: 96
I think what Stephan is getting at is that you can replace:


with:

thus improving the readability of your code.
Rob McBryde
Greenhorn

Joined: Dec 18, 2010
Posts: 16
Thanks Paul,

Makes perfect sense to me now. I've updated my code and will I ensure I stick to the more readable and less verbose approach from now on.

 
Consider Paul's rocket mass heater.
 
subject: non duplicates in a Set
 
Similar Threads
cannot find symbol
Help with Objects..
July Newsletter Puzzle (Maze Solver)
Exception in thread "main" java.lang.NullPointerException
equals and hashcode methods