как найти и вернуть объекты в java hashset
Вопрос
Согласно HashSet javadoc, HashSet.contains возвращает только логическое значение.Как я могу "найти" объект в HashSet и изменить его (это не примитивный тип данных)?
Я вижу, что в HashTable есть метод get(), но я бы предпочел использовать set .
Решение
Вы можете удалить элемент и добавить другой.
Изменение объекта, пока он находится в наборе хэшей, - это путь к катастрофе (если модификация изменяет значение хэша или поведение равенства).
Другие советы
Процитирую источник исходного кода 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;
Итак, вы платите за карту, вы также можете ею воспользоваться.
Вы можете выполнить итерацию по набору, чтобы найти свой объект.
Небольшое предупреждение от Документ по API хотя:
"Примечание:Необходимо соблюдать большую осторожность, если в качестве элементов набора используются изменяемые объекты.Поведение набора не задается, если значение объекта изменено способом, который влияет на сравнения equals, в то время как объект является элементом в наборе ".
Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
Object newobj; //modified object
hashset.add(newobj);
}
Что - то вроде:
MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);
if (hashSet.contains(obj) == true) {
hashSet.remove(obj);
obj.setSomething();
hashSet.add(obj);
}
Я столкнулся с той же проблемой и придумал следующее решение (оно должно реализовывать установленный интерфейс, но здесь представлены не все методы)
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);
}
}