TreeSet добавляет только одно значение?

Я новичок в коллекциях Java. У меня есть три класса, а именно MyData, Initializer и SetBasics.

Я создал HashSet и TreeSet. Теперь проблема в том, что HashSet работает нормально, но TreeSet хранит только одно значение.

вот мои классы

Класс Мои данные

`коллекции пакетовWorkUp.setDemos;

открытый класс MyData реализует 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;
}

} `

Инициализатор класса

коллекции пакетовWorkUp.setDemos;

Инициализатор открытого класса {

/**
 * @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----------");

}

}

Основы набора классов

коллекции пакетовWorkUp.setDemos;

импортировать java.util.HashSet; импортировать java.util.Set; импортировать java.util.TreeSet;

открытый класс 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");
        }

    }

}

}

Теперь проблема в TreeSet. Я вижу только данные d7 и больше ничего не добавляется в TreeSet


person 0o'-Varun-'o0    schedule 28.02.2014    source источник
comment
возможный дубликат Почему мой TreeSet ничего не добавляет за первым элементом?   -  person Raedwald    schedule 16.03.2015


Ответы (2)


TreeSet будет использовать вашу реализацию MyData.compareTo для сравнения элементов. Но вы его не реализовали - он всегда возвращает 0. Итак, насколько может судить TreeSet, все объекты MyData равны. См. compareTo. javadoc для получения дополнительной информации.

Обратите внимание, что HashSet работает, поскольку использует hashCode и equals. В отличие от compareTo, они имеют реализации по умолчанию в классе Object, которые основаны на равенстве ссылок. Я рекомендую вам переопределить эти два метода и вместо этого основывать их на полях MyData. Как бы то ни было, два разных объекта MyData с одинаковыми данными не будут считаться равными. (Большинство IDE могут автоматически генерировать хорошие переопределения hashCode и equals на основе указанных полей.)

person Paul Bellora    schedule 28.02.2014
comment
Спасибо, Пол, позвольте мне рассмотреть это и поработать над вашим предложением :) - person 0o'-Varun-'o0; 28.02.2014

Проблема в методе compareTo. return 0 обработка равна MyData, что добавит один объект MyData в TreeSet.

public int compareTo(MyData o) {
   //Write correct compareTo contract for MyData.
}
person Masudul    schedule 28.02.2014