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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hashtable и contains, не работает 
V
    Опции темы
devmstr
Дата 16.2.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Вот мой код:
Код

public void addNumber(int iN)
    {
       if (hst.contains(new Integer(iN)))
       {
            Integer IKey = new Integer(iN);
            Integer IVal = (Integer)hst.get(IKey);
            hst.remove(IKey);
            hst.put(IKey, new Integer( IVal.intValue() + 1));
            if (IVal.intValue() + 1 > iNMFrc)
            {
                iNMFrc = IVal.intValue() + 1;
                iMFrc = IKey.intValue();
                
            }
       }
       else
            hst.put(new Integer(iN), new Integer(1));
    }


Вызываю:
 
Код
addNumber(3);
 addNumber(3);
, а он все равно хочет добавить новую запись, а не редактировать старую. Где я туплю. В отладчике смотрел, вроде все нормально, везде 3-ка передается, но 
Код
(hst.contains(new Integer(iN)))
 категорически true не возвращает...

Это сообщение отредактировал(а) tux - 17.2.2007, 00:02


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Stampede
Дата 16.2.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Читаем внимательнее матчасть. В третьей строчке вместо:

Код

       // if (hst.contains(new Integer(iN)))
       if (hst.containsKey(new Integer(iN)))


И все должно заработать smile

ЗЫ. При использовании подсветки синтаксиса полезно также указывать язык, в данном случае Java.
PM WWW   Вверх
devmstr
Дата 19.2.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Stampede
Аа, во как. Спасибо, буду знать!


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Ratman
Дата 23.9.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у мну тут немного посложней проблема в эту тему:
выдержка из javadoc
Код

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).


Код

//берем класс,
class Pos {
    float x,y,rad;
    public Pos(float x,float y,float rad){
        this.x=x; this.y=y; this.rad=rad;
    }
//переопределяем
//если расстояние между центрами меньше суммы радиусов, значит считаем объекты равными.
    public boolean equals(Pos obj){
        if (    (this.x-obj.x)*(this.x-obj.x)    +    (this.y-obj.y)*(this.y-obj.y) 
            <      (this.rad-obj.rad)*(this.rad-obj.rad)     ) {
            return true;
        }else{
            return false;
        }
    }

}
//тестируем
public class Test {
    public static void main(String args[]){
        HashSet<Pos> set = new HashSet<Pos>();
        set.add(new Pos(2,2,2));
        set.add(new Pos(1,6,3));
        set.add(new Pos(4,4,1));
    }
}


и очень даже без ошибок добавляем в список три одинаковых объекта. В чем я неправ?

Добавлено через 6 минут и 57 секунд
и еще вопрос: где можно почитать реализацию встроенных классов (не описание как в явадоке, а сам код)?


и еще один:
 имеется пачка областей (объектов Pos)
 надо выбрать те, которые соприкасаются с некой имеющейся.
 что будет производительнее - 
- поместить их в Set и доставать contains()'ом
- или поместить их в Vector и перебором искать те, которые equals()

??
PM MAIL   Вверх
batigoal
Дата 23.9.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Цитата(Ratman @  23.9.2007,  21:19 Найти цитируемый пост)
и очень даже без ошибок добавляем в список три одинаковых объекта. В чем я неправ?

А пройдись дебаггером  smile 
Или просто запусти это: 

Код

//берем класс,

import java.util.HashSet;

class Pos {
    float x,y,rad;
    public Pos(float x,float y,float rad){
        this.x=x; this.y=y; this.rad=rad;
    }
//переопределяем
//если расстояние между центрами меньше суммы радиусов, значит считаем объекты равными.
    public boolean equals(Pos obj){
    return (this.x - obj.x) * (this.x - obj.x) + (this.y - obj.y) * (this.y - obj.y)
            < (this.rad - obj.rad) * (this.rad - obj.rad);
}
}
//тестируем
public class Test {
    public static void main(String args[]){
        HashSet<Pos> set = new HashSet<Pos>();
        Pos pos1 = new Pos(2,2,2);
        Pos pos2 = new Pos(1,6,3);
        Pos pos3 = new Pos(4,4,1);

        System.out.println("pos1.equals(pos2) = " + pos1.equals(pos2));
        System.out.println("pos1.equals(pos3) = " + pos1.equals(pos3));
        System.out.println("pos2.equals(pos3) = " + pos2.equals(pos3));

        set.add(pos1);
        set.add(pos2);
        set.add(pos3);
    }
}



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
mindflyer
Дата 24.9.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

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



Цитата(Ratman @  23.9.2007,  20:19 Найти цитируемый пост)
 имеется пачка областей (объектов Pos)
 надо выбрать те, которые соприкасаются с некой имеющейся.
 что будет производительнее - 
- поместить их в Set и доставать contains()'ом
- или поместить их в Vector и перебором искать те, которые equals()

ИМХО, использовать equals() для этой операции вообще не очень правильно - по стандартному соглашению, используемому в Java, если ты перекрываешь equals(), то ты должен перекрыть и hashCode(). И если для двух объектов equals() возвращает true, то они должны иметь одинаковый hashCode(). Не понятно, как в твоём случае выполнить это требование.
Посмотри javadoc для java.lang.Object.equals()
     * Note that it is generally necessary to override the <tt>hashCode</tt>
     * method whenever this method is overridden, so as to maintain the
     * general contract for the <tt>hashCode</tt> method, which states
     * that equal objects must have equal hash codes.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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