как найти и вернуть объекты в Java-хэш-сет - PullRequest
12 голосов
/ 21 февраля 2010

Согласно Javadoc HashSet, HashSet.contains возвращает только логическое значение. Как я могу "найти" объект в hashSet и изменить его (это не примитивный тип данных)?

Я вижу, что в HashTable есть метод get (), но я бы предпочел использовать набор.

Ответы [ 6 ]

12 голосов
/ 21 февраля 2010

Цитировать источник акции Sun java.util.HashSet:

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

Итак, вы платите за карту, и вы можете использовать ее.

12 голосов
/ 21 февраля 2010

Вы можете удалить элемент и добавить другой.

Изменение объекта, пока он находится в хэш-наборе, - это рецепт катастрофы (если модификация изменяет значение хеш-функции или поведение равенства).

2 голосов
/ 21 февраля 2010

Вы можете перебрать множество, чтобы найти свой объект.

Слово предупреждения из API doc , хотя:

"Примечание: следует проявлять особую осторожность, если в качестве элементов набора используются изменяемые объекты. Поведение набора не указывается, если значение объекта изменяется таким образом, что это влияет на сравнения на равных, когда объект элемент в наборе. "

0 голосов
/ 29 января 2013

Я столкнулся с той же проблемой и нашел следующее решение (оно должно реализовывать интерфейс Set, но здесь не все методы)

public class MySet<T> implements Set<T>{

    private HashMap<T,T> items = new HashMap<T,T>();


    public boolean contains(Object item) 
    {
        return items.containsKey(item);
    }

    public boolean add(T item) 
    {
        if (items.containsKey(item))
            return false;
        else
        {
            items.put(item, item);
            return true;
        }
    }

    public T get(T item) 
    {
        return items.get(item);
    }
}
0 голосов
/ 21 февраля 2010

Что-то вроде:

MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);

if (hashSet.contains(obj) == true) {
    hashSet.remove(obj);
    obj.setSomething();
    hashSet.add(obj);
}
0 голосов
/ 21 февраля 2010
Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
   Object newobj; //modified object
   hashset.add(newobj);
}
...