Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / December 2006

Tip: Looking for answers? Try searching our database.

Using a simple class with overridden .equals() for TreeSet.contains() doesn't work

Thread view: 
StM - 18 Dec 2006 14:06 GMT
I have this class, which is defined as an inner class of another class
(so it's not the most beautiful class ever, but I needed it for a
really simple task):

#######################################################################

class SimpleClass {
            String attrib_one;
            String attrib_two;
            String attrib_three;

            SimpleClass(String attrib_one, String attrib_two, String
attrib_three) {
                this.attrib_one = attrib_one;
                this.attrib_two = attrib_two;
                attrib_three = attrib_three;
            }

            public boolean equals(Object obj) {
                if (obj instanceof SimpleClass) {
                    SimpleClass sc = (SimpleClass) obj;
                    return(attrib_two.equals(sc.attrib_two)
                            && (attrib_one.equals(sc.attrib_one))
                            && (attrib_three.equals(sc.attrib_three)));
                } else
                    return false;
            }

            public int hashCode() {
                return attrib_one.hashCode() + attrib_two.hashCode() +
attrib_three.hashCode();
            }

            public String toString() {
                return ("[attrib_one: " + attrib_one + "; attrib_two: " +
attrib_two + "; attrib_three: " + attrib_three + "]");
            }
        }

#######################################################################

As you can see, there are three attributes and three methods of the
Object class overwritten (equals(), hashCode() - i don't actually need
it -, and toString()).

Somewhere else in the code, i check if a SimpleClass object is already
in a specified TreeSet

#######################################################################

TreeSet ts = new TreeSet();
[...]
SimpleClass sc = new SimpleClass(string1, string2, string3);
if (ts.contains(sc)) {
  //blah blah
}

#######################################################################

and in the "if" branch I put the generated object in the TreeSet
itself.

#######################################################################

  //blah blah
  ts.add(sc);
  //blah blah

#######################################################################

Now, the first .contains() is executed normally (I suppose that the
TreeSet simply sees it's empty), while the second throws a
ClassCastException. I don't know why is this happening. I'm absolutely
sure that when i cast a (SimpleClass), the object IS a SimpleClass.

I've searched the archives but I didn't find any clue. I'm using java
1.4.2.

Thanks for your help.

StM
Daniel Dyer - 18 Dec 2006 14:17 GMT
> As you can see, there are three attributes and three methods of the
> Object class overwritten (equals(), hashCode() - i don't actually need
[quoted text clipped - 29 lines]
> ClassCastException. I don't know why is this happening. I'm absolutely
> sure that when i cast a (SimpleClass), the object IS a SimpleClass.

To use a TreeSet, your elements must implement Comparable or you must  
provide a Comparator to the constructor.  You are doing neither.  You  
haven't posted the actual error message, but presumably the TreeSet is  
trying to cast one of its elements to Comparable and failing.

Dan.

Signature

Daniel Dyer
http://www.uncommons.org

StM - 18 Dec 2006 14:37 GMT
> To use a TreeSet, your elements must implement Comparable or you must
> provide a Comparator to the constructor.  You are doing neither.  You
> haven't posted the actual error message, but presumably the TreeSet is
> trying to cast one of its elements to Comparable and failing.
>
> Dan.

You're right; and I have to admit that I wouldn't have found this by
myself: the error was misleading me, and besides I had already chosen
an alternative solution; but I wanted to check anyway what I did wrong.

Thank you very much.

StM

> --
> Daniel Dyerhttp://www.uncommons.org
John Ersatznom - 18 Dec 2006 20:45 GMT
> I have this class, which is defined as an inner class of another class
> (so it's not the most beautiful class ever, but I needed it for a
[quoted text clipped - 12 lines]
>                 this.attrib_two = attrib_two;
>                 attrib_three = attrib_three;

Besides the lack of comparator or Comparable implemented, there's also
the above error. It should say "this.attrib_three = attrib_three" or the
attrib_three string of the class stays null.
StM - 19 Dec 2006 18:32 GMT
> > I have this class, which is defined as an inner class of another class
> > (so it's not the most beautiful class ever, but I needed it for a
[quoted text clipped - 14 lines]
> the above error. It should say "this.attrib_three = attrib_three" or the
> attrib_three string of the class stays null.

I think this is an error of transcription (I, uh, anonymized the names
of the variables). Thank you for pointing that out, anyway.


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.