Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Доступ к HashSet


Автор: GrayVulf 4.2.2010, 16:30
Скажите, можно ли получить доступ к объекту находящемуся в HashSet, для изменения его переменных
Это объект,


Код

class CounterForSet{
int i=0;
    int number;
    CounterForSet(int n){
        number=n;
    }
    public String toString(){
        return Integer.toString(number)+"-"+Integer.toString(i);
    }
    public int hashCode(){
        return number;
    }
    public boolean equals(Object ob){
        CounterForSet counter=(CounterForSet)ob;
        if (number==counter.number) return true;
        return false;
    }
    
}



в цикле требуется инкрементировать его поле i

Это код в котором происходит изменение
Код

void fillSet(Set list){
    Random r=new Random();
    for (int i=0;i<1000;i++){
        int pos=Math.abs(r.nextInt())%20+1;
        CounterForSet obj=new CounterForSet(pos);
        if (list.contains(obj))
        // здесь надо получить доступ к объекту 
                        // находящемуся в HashSet чтобы увеличить
        // счетчик объекта на единицу (obj.i++)
        else
            list.add(obj);
    }
}

Или это, принципиально, невозможно?


Автор: LSD 4.2.2010, 17:45
А где HashSet то? А вообще HashSet.get() возвращает именно ссылку на объект и дальше ты можешь с ним делать все что хочешь, в том числи и инкрементировать поле (если доступ есть).

Автор: GrayVulf 4.2.2010, 17:56
В этом-то и весь вопрос, что у HashSet не определен метод get(), отсутствует.

Автор: LSD 4.2.2010, 18:32
Я неправильно понял вопрос. В твоем случае надо использовать HashMap<Integer, CounterForSet>, тогда все будет просто и логично.

Автор: GrayVulf 4.2.2010, 18:47
Да, в данном случае с HashMap все гораздо проще и логичней. Но хочется выяснить возможен ли доступ  к объекту в HashSet или нет. Казалось бы при наличии метода HashSet.contains(Object), который определяет наличие объекта, так же легко можно было и получить к нему доступ.
Единственное, как у меня получилось получить доступ к объекту это использовать Iterator, то есть методом перебора. Нерационально и геморройно
Код

void fillSet(Set list){
    Random r=new Random();
    for (int i=0;i<1000;i++){
        int pos=Math.abs(r.nextInt())%20+1;
        CounterForSet obj=new CounterForSet(pos);
        Iterator it =list.iterator();
        if (list.contains(obj)){
            CounterForSet obj2;
            while (it.hasNext()){
                obj2=(CounterForSet)it.next();
                if (obj.equals(obj2)) obj2.i++;
            }
        }
        else
            list.add(obj);
    }
}

Автор: LSD 4.2.2010, 18:53
Цитата(GrayVulf @  4.2.2010,  18:47 Найти цитируемый пост)
Казалось бы при наличии метода HashSet.contains(Object), который определяет наличие объекта, так же легко можно было и получить к нему доступ.

Ну тут как бы идея в том, что если у тебя уже есть объект (тот который ты передаешь в метод contains()), то что тебе еще надо? Объект-то equals() тому объекту который храниться в HashSet.

Автор: GrayVulf 4.2.2010, 19:22
Да, объект equals(), но при инкрементировании поля этого объекта, объект который в HashSet не меняется. Это же разные объекты, и equals() они по другим полям.
Код

void fillSet(Set list){
    Random r=new Random();
    for (int i=0;i<countIteration;i++){
        int pos=Math.abs(r.nextInt())%20+1;
        CounterForSet obj=new CounterForSet(pos);    
        if (list.contains(obj))
                           obj.i++;
        else
             list.add(obj);
    }
}

По идее, тогда должен быть правилен этот код. Но он не работает, объекты в контейнере не изменяются.

Автор: COVD 4.2.2010, 19:37
deleted

Автор: GrayVulf 4.2.2010, 20:01
Это что значит? Обсуждение закончено?

Автор: COVD 4.2.2010, 20:26
Нет, я удалил свою ошибку smile
Обьект в Set хранится по ключу, который автоматически вычисляется, т.е. это очевидно hashCode. Этим Set и удобнее в некоторых ситуациях, чем HashMap, где ключ надо определять явно. Set удобен для создания коллекции уникальных обьектов. Именно коллекции, поэтому там нет метода get. 

Автор: GrayVulf 4.2.2010, 21:03
Теперь все ясно. Спасибо

Добавлено через 2 минуты и 34 секунды
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)