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

Код: 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
Hashtable. Изменение полей ключа
    #33819388
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если в качестве ключа использовать тип String?
и во-вторых, вы ведь переопределили метод hashCode. и он возвращает в обоих случаях одинаковое значение, собственно говоря Вам только показалось что вы поменяли ключ - на самом деле он остался тем же..
попробуйте менять у класса поле id
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819392
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что, как мне кажется, хеш-таблице все равно какой объект и какие поля у ключа - главное - что возвращает hashCode
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819414
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
Понятно, что не стоит менять поля ключа, которые изменят hashCode.
Просто у меня сначала была сложность вообще поменять поле ключа, любое.
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819435
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
И даже при измении id в примере выше похоже никаких коллизий не происходит.
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819563
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯИ даже при измении id в примере выше похоже никаких коллизий не происходит.

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

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

и полями, определяющими сам ключ (вычисляемый в hashCode) - эту информацию менять нельзя.
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819724
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот есть одна из очень хороших статей по этой проблеме:
Сравнение объектов
...
Рейтинг: 0 / 0
Hashtable. Изменение полей ключа
    #33819765
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати неполенился заглянуть в исходники 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
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable. Изменение полей ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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