Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable. Изменение полей ключа / 15 сообщений из 15, страница 1 из 1
28.06.2006, 14:09
    #33819236
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
Может немного тупой вопрос.
Есть уже заполненная Hashtable. Необходимо пройтись последовательно по всем ключам и у каждого ключа-объекта изменить/установить некое поле.
Можно сделать?
...
Рейтинг: 0 / 0
28.06.2006, 14:19
    #33819268
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
ничего не выйдет, т.к. при добавлении нвой записи в таблицу из ключа вычисляется hashcode который является индексом в массиве... если даже и попытаться изменить все ключи, необходимо будет тогда и повторно вычислить значения hashcode, что в худшем случае вызовет просто нарушение целостности таблицы.
...
Рейтинг: 0 / 0
28.06.2006, 14:24
    #33819279
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
тоесть хотел сказать в лучшем случае :)
...
Рейтинг: 0 / 0
28.06.2006, 14:40
    #33819342
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
А так вроде работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
 import  java.util.*;

 class  Bean {
	 private   int  id;
	 private  String field = "AAA";
	
	 public  Bean ( int  _id) {
		id = _id;
	}
	 public   int  hashCode() {
		 return  id;
	}
	 public  String getField() {
		 return  field;
	}
	 public   void  setField(String field) {
		 this .field = field;
	}
}

 public   class  TestHashTable {
	 public   static   void  main(String[] args) {
		// Заполнили HashTable
		Hashtable tbl =  new  Hashtable();
		 for  ( int  i= 0 ; i <  10 ; i++) {
			tbl.put( new  Bean(i), "");
		}
		// Получаем ключи
		Set keys = tbl.keySet();
		Iterator it = keys.iterator();
		 while  (it.hasNext()) {
			// Печатаем что было изначально
			Bean bean = (Bean)it.next();
			System.out.println(bean.getField());
			// Задаем новое значение
			bean.setField("!!!");
		}
		
		Set keys2 = tbl.keySet();
		it = keys2.iterator();
		 while  (it.hasNext()) {
			// Печатаем новые (???) значения
			Bean bean = (Bean)it.next();
			System.out.println(bean.getField());
		}
	}
}
...
Рейтинг: 0 / 0
28.06.2006, 14:52
    #33819388
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
а если в качестве ключа использовать тип String?
и во-вторых, вы ведь переопределили метод hashCode. и он возвращает в обоих случаях одинаковое значение, собственно говоря Вам только показалось что вы поменяли ключ - на самом деле он остался тем же..
попробуйте менять у класса поле id
...
Рейтинг: 0 / 0
28.06.2006, 14:53
    #33819392
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
потому что, как мне кажется, хеш-таблице все равно какой объект и какие поля у ключа - главное - что возвращает hashCode
...
Рейтинг: 0 / 0
28.06.2006, 14:58
    #33819414
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
Понятно, что не стоит менять поля ключа, которые изменят hashCode.
Просто у меня сначала была сложность вообще поменять поле ключа, любое.
...
Рейтинг: 0 / 0
28.06.2006, 15:02
    #33819435
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
И даже при измении id в примере выше похоже никаких коллизий не происходит.
...
Рейтинг: 0 / 0
28.06.2006, 15:31
    #33819563
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
ЯИ даже при измении id в примере выше похоже никаких коллизий не происходит.

а вы уверены что после изменения ключей по ним извлекаются их же значения? в вашем коде вы не увидете изменений потому что в таблицу ложите ключ и пустую строку... а вы попробуйте ложить не пустую строку а конкретное значение...
...
Рейтинг: 0 / 0
28.06.2006, 15:33
    #33819572
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
у класса Hashtable есть метод rehash() ктоорый производит увеличение таблицы в 2 раза и перевычисление индексов... но этот метод protected и вы не сможете им воспользоваться...
...
Рейтинг: 0 / 0
28.06.2006, 15:35
    #33819580
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
кроме того в вашем примере вы работаете только с ключами - извлекая их из таблицы. но ведь таблица - это пара КЛЮЧ - ЗНАЧЕНИЕ..
уверен что у вас после изменения ключей эта связь будет некорректной
...
Рейтинг: 0 / 0
28.06.2006, 15:51
    #33819643
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
unicornmirageкроме того в вашем примере вы работаете только с ключами - извлекая их из таблицы. но ведь таблица - это пара КЛЮЧ - ЗНАЧЕНИЕ..
уверен что у вас после изменения ключей эта связь будет некорректной
Да, похоже, что при изменении ключа т. о. что меняется хэш код, в качестве значений возвращаются нулевые ссылки (ну не факт что всегда null будет).
Но если хэш код не меняется, то все в порядке. Что в принципе мне и было нужно :)
...
Рейтинг: 0 / 0
28.06.2006, 16:04
    #33819705
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
Я unicornmirageкроме того в вашем примере вы работаете только с ключами - извлекая их из таблицы. но ведь таблица - это пара КЛЮЧ - ЗНАЧЕНИЕ..
уверен что у вас после изменения ключей эта связь будет некорректной
Да, похоже, что при изменении ключа т. о. что меняется хэш код, в качестве значений возвращаются нулевые ссылки (ну не факт что всегда null будет).
Но если хэш код не меняется, то все в порядке. Что в принципе мне и было нужно :)

да, такой подход будет верным - использовать в качестве ключа объект с полями которые можно редактировать (назовем их информацией о ключе)

и полями, определяющими сам ключ (вычисляемый в hashCode) - эту информацию менять нельзя.
...
Рейтинг: 0 / 0
28.06.2006, 16:11
    #33819724
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
вот есть одна из очень хороших статей по этой проблеме:
Сравнение объектов
...
Рейтинг: 0 / 0
28.06.2006, 16:27
    #33819765
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable. Изменение полей ключа
кстати неполенился заглянуть в исходники Hashtable.java

вот что происходит при добавлении новой записи в таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 public   synchronized  V put(K key, V value) {
	// Make sure the value is not null
	 if  (value ==  null ) {
	     throw   new  NullPointerException();
	}

	// Makes sure the key is not already in the hashtable.
	Entry tab[] = table;
	 int  hash = key.hashCode();
	 int  index = (hash & 0x7FFFFFFF) % tab.length;
	 for  (Entry<K,V> e = tab[index] ; e !=  null  ; e = e.next) {
	     if  ((e.hash == hash) && e.key.equals(key)) {
		V old = e.value;
		e.value = value;
		 return  old;
	    }
	}

	modCount++;
	 if  (count >= threshold) {
	    // Rehash the table if the threshold is exceeded
	    rehash();

            tab = table;
            index = (hash & 0x7FFFFFFF) % tab.length;
	} 

	// Creates the new entry.
	Entry<K,V> e = tab[index];
	tab[index] =  new  Entry<K,V>(hash, key, value, e);
	count++;
	 return   null ;
    } 

как видно из фрагмента - внутри класса Hashtable есть переменная tab которая является обыкновенным массивом, хранящим значения, помещаемые в таблицу.. индексы этого массива вычисляются на основании хеш-кода объекта, который выступает в качестве ключа...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable. Изменение полей ключа / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]