Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к HashSet, получение ссылки из HashSet 
V
    Опции темы
GrayVulf
Дата 4.2.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Скажите, можно ли получить доступ к объекту находящемуся в 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);
    }
}

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


PM MAIL   Вверх
LSD
Дата 4.2.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
GrayVulf
Дата 4.2.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



В этом-то и весь вопрос, что у HashSet не определен метод get(), отсутствует.
PM MAIL   Вверх
LSD
Дата 4.2.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
GrayVulf
Дата 4.2.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Да, в данном случае с 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);
    }
}

PM MAIL   Вверх
LSD
Дата 4.2.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
GrayVulf
Дата 4.2.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Да, объект 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);
    }
}

По идее, тогда должен быть правилен этот код. Но он не работает, объекты в контейнере не изменяются.
PM MAIL   Вверх
COVD
Дата 4.2.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



deleted

Это сообщение отредактировал(а) COVD - 4.2.2010, 19:41
PM MAIL   Вверх
GrayVulf
Дата 4.2.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Это что значит? Обсуждение закончено?
PM MAIL   Вверх
COVD
Дата 4.2.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Нет, я удалил свою ошибку smile
Обьект в Set хранится по ключу, который автоматически вычисляется, т.е. это очевидно hashCode. Этим Set и удобнее в некоторых ситуациях, чем HashMap, где ключ надо определять явно. Set удобен для создания коллекции уникальных обьектов. Именно коллекции, поэтому там нет метода get. 
PM MAIL   Вверх
GrayVulf
Дата 4.2.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Теперь все ясно. Спасибо

Добавлено через 2 минуты и 34 секунды
 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.