Значение объекта обновления TreeSet кажется ошибкой в ​​реализации

Я проверял набор деревьев и заметил, что не могу обновить значение в наборе деревьев для своего пользовательского объекта.

e.g

class Emp implements Comparable<Emp>
{
int id;
String name;

public Emp(int id,String name)
{
    this.id=id;
    this.name=name;
}

@Override
public int compareTo(Emp obj) {
        if(obj.id>this.id)
            return -1;
        else if(obj.id<this.id)
            return 1;
        else
            return 0;
}

@Override
public String toString() {
    return "Emp Id:"+id+" Emp Name:"+name;
}
}
public static void main(String[] args) {
    treesetwithCustom();
}

public static void treesetwithCustom()
{
    TreeSet<Emp> set=new TreeSet<Emp>();
    set.add(new Emp(1,"ABC"));
    set.add(new Emp(2,"XYZ"));
    set.add(new Emp(1,"PQR"));
    System.out.println(set);
}

Когда я печатаю набор, он показывает значение для Emp ID 1 как ABC, а не PQR.

когда я проверяю rt.jar для реализации набора деревьев, я замечаю, что в реализации есть ошибка, поскольку TreeSet внутренне использует реализацию, предоставленную TreeMap, и вызывает метод put TreeMap.

В rt.jar код размещения обновляет значение, а не Key, а в TreeSet значение для ключа всегда передается как присутствует.

Пожалуйста, помогите мне понять, есть ли способ добиться обновления в наборе деревьев и правильно ли я понимаю ошибку.


person Sandesh Dhotre    schedule 29.11.2015    source источник
comment
Добавляет указанный элемент в этот набор, если он еще не присутствует. Что вы думаете об этом?   -  person Sotirios Delimanolis    schedule 29.11.2015
comment
когда я помещаю объект emp с тем же идентификатором с другим набором хэшей имени, сохраняйте старый объект, даже если значение для имени изменяется, как я могу обновить значение в TreeSet   -  person Sandesh Dhotre    schedule 29.11.2015
comment
Это ожидаемое поведение TreeSet, как указано в цитате из javadoc из моего последнего комментария.   -  person Sotirios Delimanolis    schedule 29.11.2015
comment
если вы хотите изменить элемент в наборе, вам нужно сначала удалить, а затем добавить.   -  person jtahlborn    schedule 29.11.2015
comment
Ага. Это работает так, как задумано Java, даже если это не то, что вы ожидали.   -  person Louis Wasserman    schedule 29.11.2015


Ответы (1)


Как уже объяснили другие, описанное поведение следует ожидать и явно указывать в описании API JDK для класса TreeSet.

Если вы ищете способ обновлять свою коллекцию, ознакомьтесь с моей реализацией UpdateableTreeSet. Здесь есть несколько статей о SO, которые относятся к той же проблеме, а также к UpdateableTreeSet:

person kriegaex    schedule 29.11.2015