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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hashtable 
:(
    Опции темы
sevenquest
Дата 29.4.2004, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если работали когда нить с Hashtable, плз, подскажите: везде написано что при записи новой инфы по ключу (String) старая с таким ключем затираеться, так же можно удалить запись по ключу, так вот я столкнулся с тем что записи не перезаписываються и не удаляються, и если я три раза, например, заношу в Hashtable записи с одинаковым ключем потом при переборе итератором они все считывають. Можете дать какой нить совет?
PM MAIL   Вверх
polosatij
  Дата 29.4.2004, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



tebe objazatel'no Hashtable?

esl net -> to smotri interface "Map" v tom zhe pakete.. on ne dopuskaet povtorenij kljucha..
no, pomojmu, dopuskaet odinakovye znachenija s raznymi kljuchami..

a Hashtable -> This class implements a hashtable, which maps keys to values. Any non-null object can be used as a key or as a value.

udachi rolleyes.gif


--------------------
PM   Вверх
AntonSaburov
Дата 30.4.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата
заношу в Hashtable записи с одинаковым ключем потом при переборе итератором они все считывають. Можете дать какой нить совет?

Хорошо бы код посмотреть - насколько они у тебя одинаковые. А так ничего понять не получится.
PM MAIL WWW ICQ   Вверх
sevenquest
Дата 30.4.2004, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ключем являеться переменные типа String, объектом некий класс. Интересуемые места выделил жирным. Кстати спасибо AntonSaburov за таймер.

//Класс добавляемый как объект в jRSMessageHT с внутренним таймером
class arrayOfMHT{
int period;
int start;
int current;
int len;
String[] s;
final int t = 1000;
OutputStream os;

//Конструктор
public arrayOfMHT(OutputStream os, int period, int start, int len, String[] s){
this.os = os;
this.period = period;
this.start = start;
current = this.period + this.start;
this.s = s;
this.len = len;
Timer();
}

//Таймер
void Timer(){
javax.swing.Timer timer = new javax.swing.Timer(t, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Tick();
}
});
timer.start();
}

//Передача сообщения
public void Send(){
try{
for(int i=0; i<=len-1; i++){
os.write(Message(s[i]).getBytes());
jTextArea.append(s[i] + "\n");
}
}catch(Exception e){System.out.println("init error: "+e);}
}

//Счетчик тактов и передача инфы
void Tick(){
current--;
if (current == 0) {
current = period;
Send();
}
}
}

class readThread extends Thread{
byte buf[] = new byte[16*1024];
int col;
Socket s;
InputStream is;
OutputStream os;
Hashtable ht;

public readThread(Socket s, Hashtable ht){
this.s = s;
this.ht = ht;

try{
is = s.getInputStream();
os = s.getOutputStream();
}catch(Exception e){System.out.println("init error: "+e);}

this.ht.put("06", new arrayOfMHT(os, 11, 1, 1, new String[] {RSIM06}));
this.ht.put("10", new arrayOfMHT(os, 12, 2, 1, new String[] {RSIM10}));
this.ht.put("07", new arrayOfMHT(os, 13, 3, 2, new String[] {RSIM07_1, RSIM07_2}));
this.ht.put("11", new arrayOfMHT(os, 14, 4, 1, new String[] {RSIM11}));
this.ht.put("21", new arrayOfMHT(os, 15, 5, 3, new String[] {RSIM21_1, RSIM21_2, RSIM21_3}));
this.ht.put("22", new arrayOfMHT(os, 16, 6, 1, new String[] {RSIM22}));

setDaemon(true);
setPriority(NORM_PRIORITY);
start();
}

//возвращающий true при равенстве контрольной суммы строки и контрольной суммы,
//расчитанной по этой строке
boolean Check(StringBuffer sb){
int i=sb.indexOf("*");
int hex = Integer.parseInt(sb.substring(i+1, i+3), 16);
sb.delete(0,1);
sb.delete(i-1,i+2);
if (CheckSum(new String(sb))==hex) return true;
else return false;
}

private String InpMesRSIM_01(StringBuffer s){
String str = null;

String key = FindCommas(s, 2, ",");
String act = FindCommas(s, 4, ",");
String period = FindCommas(s, 5, ",");
String start = null;
try{
start = FindCommas(s, 6, ",");
}catch(Exception e){
start = FindCommas(s, 6, "<");
}

arrayOfMHT ar = (arrayOfMHT) ht.get(key);

if ((act==null)&(period==null)&(start==null))
if (ar != null) {
ar.Send();
str = new String("Обработан запрос на RSIM#" + key + "\n" +
"Выслан ответ\n");
}
else {
str = new String("Обработан запрос на RSIM#" + key + "\n" +
"RSIM#" + key + " не обнаружен\n");
}
return str;
}

private String InpMesRSIM_Single(StringBuffer s){
String key = FindCommas(s, 1, ",");
arrayOfMHT ar = (arrayOfMHT) this.ht.get(key);
// this.ht.remove(key); - пробовал и удалять перед перезаписью
this.ht.put(key, new arrayOfMHT(ar.os, ar.period, ar.start, ar.len, new String[] {new String(s)}));


return new String("Приняты установки RSIM#" + key + "\n");
}


//Процедура обработки принятых символов второго уровня
//определяет тип сообщения, проводит проверку контрольной суммы, отсылает на обработку
//при совпадении контрольных сумм
private void messageReview_level2(StringBuffer sb){
switch (Integer.parseInt(FindCommas(sb, 1, ","))) {
case 1:
if (Check(sb)==true) jTextArea.append(InpMesRSIM_01(sb));
break;
case 11:
if (Check(sb)==true) jTextArea.append(InpMesRSIM_Single(sb));
break;
}
}

//Процедура обработки принятых символов первого уровня
//выбирает сообщения из входного буфера сокета и отправляет на обрабоку
private void messageReview_level1(){
StringBuffer data = new StringBuffer(new String(buf, 0, col));
do{
int l = data.indexOf("$");
int m = data.indexOf("<CR><LF>") + 8;
messageReview_level2(new StringBuffer(data.substring(l, m)));
data.delete(l,m);
}while(data.length()>0);
}

//Читаем из сокета
public void run(){
while(true){
try{
col = is.read(buf);
if (col>0) messageReview_level1();
}catch(Exception e){System.out.println("init error: "+e);}
}
}
}

P.S. Мне сказали что одно и тоже значение переменной например типа String может иметь различный хеш код... Это так?
PM MAIL   Вверх
AntonSaburov
Дата 30.4.2004, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата
Мне сказали что одно и тоже значение переменной например типа String может иметь различный хеш код...

Все зависит от того, как этот класс вычисляет хэш. Для String одинаковые строки будут иметь одинаковый хэш - это точно.
Для того же Object это адрес объекта. И будут они разные.

А код, что ты привел - надо это дело продебажить. IMHO где-то ты ошибаешься, может там пробел какой или спец-символ остается.
PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 8.5.2004, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



What about
Код
String key = FindCommas(s, 1, ",");


It should return exactly "10", "11" or something. If it gives say "11 " this will be considered as different key. May be trim() it?

Btw, obviously youre trying to find some chunks of text using this method. Itd be much simpler to use someth like indexOf() or StringTokenizer.


--------------------

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

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

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


 




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


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

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