Reputation: 735
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
Upvotes: 3
Views: 2665
Reputation: 55213
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.)
Upvotes: 5
Reputation: 21961
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.
}
Upvotes: 2