Question

I am new to Java Collections. I have three classes namely MyData, Initializer and SetBasics

I have created a HashSet and a TreeSet. Now the problem is HashSet is working fine but TreeSet is only storing one value.

Here are my classes

Class MyData

`package collectionsWorkUp.setDemos;

public class MyData implements Comparable{

MyData(){   
}

MyData(String n, String p, String eM, long mn, char s){
    name = n;
    profession = p;
    email = eM;
    mobileNo = mn;
    sex =  s;
}


private String name;
private String profession;
private String email;
private long mobileNo;
private char sex;


public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getProfession() {
    return profession;
}
public void setProfession(String profession) {
    this.profession = profession;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public long getMobileNo() {
    return mobileNo;
}
public void setMobileNo(long mobileNo) {
    this.mobileNo = mobileNo;
}
public char getSex() {
    return sex;
}
public void setSex(char sex) {
    this.sex = sex;
}

@Override
public int compareTo(MyData o) {
    // TODO Auto-generated method stub
    return 0;
}

} `

Class Initializer

package collectionsWorkUp.setDemos;

public class Initializer {

/**
 * @param args
 */
public static void main(String[] args) {

    System.out.println("Initializing");

    SetBasics operate = new SetBasics();

    operate.DataInSet();
    operate.printDataInSet(operate.getUsersInHash());

    System.out.println("\n\nPrinting Data in Tree Set--------------------");
    operate.printDataInSet(operate.getUsersInTree());

    System.out.println("\n\n--------Program Terminated----------");

}

}

Class SetBasics

package collectionsWorkUp.setDemos;

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

public class SetBasics{

    private Set<MyData> usersInHash = new HashSet<MyData>();
    private Set<MyData> usersInTree =  new TreeSet<MyData>();

    MyData d1= new MyData(d1's data -data include name, #, profession etc check MyData Class);
    MyData d2=  new MyData(d2's data);
    MyData d3=  new MyData(d3's data);
    MyData d4= new MyData(d4's data);
    MyData d5= new MyData(d5's data);
    MyData d6= new MyData(d6's data);
    MyData d7= new MyData(d7's data);
    MyData nullUser = null;

    public Set<MyData> getUsersInHash() {
        return usersInHash;
    }

    public Set<MyData> getUsersInTree() {
        return usersInTree;
    }

public SetBasics(){ }

public void DataInSet(){

    {
        System.out.println("Adding Data in HashSet");
        System.out.println("Data in HashSet Before Adding Element:" + usersInHash.size());
        setDataInSet(nullUser);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d7);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d6);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d5);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d4);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d3);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d2);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(d1);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
        setDataInSet(null);
        System.out.println("Data in HashSet After Adding Element:" + usersInHash.size());
    }

    {
        System.out.println("Adding Data in TreeSet");
        System.out.println("Users in Tree after Before Data:"+usersInTree.size());
        setDataInTreeSet(d7);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d6);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d5);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d4);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d3);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d2);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());
        setDataInTreeSet(d1);
        System.out.println("Users in Tree after Adding Data:"+usersInTree.size());

        printDataInSet(usersInTree);
    }

}

public void setDataInSet(MyData userDetails){
    System.out.println("Setting Data in HashSet");
    usersInHash.add(userDetails);       
}

public void setDataInTreeSet(MyData userDetails){
    System.out.println("Setting Data in TreeSet");
    usersInTree.add(userDetails);
}

public void printDataInSet(Set<MyData> s){
    System.out.println("Printing Data");
    System.out.println("Size of the Set:"+s.size());
    for(MyData itorator: s){
        try{
            System.out.println("User Details:______");
            System.out.println("Name:"+itorator.getName());
            System.out.println("Mobile Number:"+itorator.getMobileNo());
            System.out.println("eMail:"+itorator.getEmail());
            System.out.println("Profession:"+itorator.getProfession());
            System.out.println("Sex:"+itorator.getSex());

        }catch(NullPointerException npe){
            System.out.println(npe.getMessage());
            npe.getStackTrace();
        }finally{
            System.out.println("EOD_____\n");
        }

    }

}

}

Now the problem is in TreeSet I can only see the data of d7 only and nothing else is getting added to TreeSet

Was it helpful?

Solution

The TreeSet will use your MyData.compareTo implementation to compare elements. But you haven't implemented it - it always returns 0. So as far as the TreeSet can tell, all MyData objects are equal. See the compareTo javadoc for more info.

Note that the HashSet is working because it uses hashCode and equals. Unlike compareTo, these have default implementations in the Object class, which are based on reference equality. I recommend you override these two methods and base them on the MyData fields instead. As it is, two different MyData objects with identical data will not be considered equal. (Most IDEs can auto-generate good hashCode and equals overrides based on specified fields.)

OTHER TIPS

The problem is on compareTo method. return 0 treat equals MyData, which will add one MyData object at TreeSet.

public int compareTo(MyData o) {
   //Write correct compareTo contract for MyData.
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top