![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| sevenquest |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 21.4.2004 Репутация: нет Всего: нет |
Если работали когда нить с Hashtable, плз, подскажите: везде написано что при записи новой инфы по ключу (String) старая с таким ключем затираеться, так же можно удалить запись по ключу, так вот я столкнулся с тем что записи не перезаписываються и не удаляються, и если я три раза, например, заношу в Hashtable записи с одинаковым ключем потом при переборе итератором они все считывають. Можете дать какой нить совет?
|
|||
|
||||
| polosatij |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Хорошо бы код посмотреть - насколько они у тебя одинаковые. А так ничего понять не получится. |
|||
|
||||
| sevenquest |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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 может иметь различный хеш код... Это так? |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Все зависит от того, как этот класс вычисляет хэш. Для String одинаковые строки будут иметь одинаковый хэш - это точно. Для того же Object это адрес объекта. И будут они разные. А код, что ты привел - надо это дело продебажить. IMHO где-то ты ошибаешься, может там пробел какой или спец-символ остается. |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
What about
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. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |