BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / dot-net / #1070同步于 2010/1/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖

数据库,哈希表的问题

diyutianshi1
2010/1/4镜像同步11 回复
红色部分为出错的代码,因为我的Hash的value设定的是Arraylist,所以我认为ht(key).add就能够实现Arraylist.Add的功能,从而达到动态修改Arraylist的目的 部分代码如下:while (odr_curral.Read())//读取数据,如果odr_curral.Read()返回为false的话,就说明到记录集的尾部了 { ArrayList pid = new ArrayList(); program.pid=(int) odr_curral.GetOracleNumber(0); key.title = MyMd5_2(odr_curral.GetOracleString(1).ToString()); //从中文分词结果中得到节目内容 OracleCommand cmd2 = conn_combobox.CreateCommand(); cmd2.CommandText = "select result from PROGRAM_DIVIDE_RESULT where PID ='"+program.pid+"'";//在这儿写sql语句 OracleDataReader odr_curral2 = cmd.ExecuteReader();//创建一个OracleDateReader对象 while (odr_curral2.Read()) { newcontent = odr_curral2.GetOracleString(0).ToString(); }//获得节目内容 if (ht.Contains(key.title))//判断哈希表是否包含特定键,其返回值为true或false { //获得旧有节目的内容 for (int i = 0; i <= ht(key.title).Count - 1; i++) { OracleCommand cmd1 = conn_combobox.CreateCommand(); cmd1.CommandText = "select result from program_divide_result where pid='" + ht(key.title)[i] + "'"; OracleDataReader curral = cmd1.ExecuteReader(); while (curral.Read()) { oldcontent = curral.GetOracleString(0).ToString(); } int LD = LevenshteinDistance(newcontent, oldcontent);//求两节目内容的编辑距离 if ((LD / newcontent.Length) < 0.1)//编辑距离:字符串长度<0.1则认为是相似的 { messageLable.Text = "有重复数据!"; sw.Write("信息" + program.pid + "和原有序号为" + ht[key] + "重复\r\n"); cmd.CommandText = "insert into PROGRAM_REPEAT_INDEX (PRI_ID,NEW_PID,OLD_PID)values ('" + program.pid + "','" + program.pid + "','" + ht[key] + "')"; cmd.ExecuteNonQuery(); } else//题目相同但内容不同 { ht(key.title).Add(program.pid); } } } else { pid.Add(program.pid);//把新节目的pid写入到键值中 ht.Add(key.title, pid); //添加key/value键值对 HTLENTH = HTLENTH + 1;//哈希表元素个数加1 MD5Queue.Enqueue(key.title);//添加md5.title到队列中 if (HTLENTH == 100000) HashRefresh();//当哈希元素到达100000时,哈希表更新,删除掉5%的哈希元素 } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ahomer机器人#1 · 2010/1/4
value可以是任意类型吧 请用Dictionary,查查相关用法 如果value是引用类型,进行修改注意不要对其他数据造成破坏就行 比如value是一个list,然后把这个list赋给一个值,然后使用, 然后又对这个list修改,会对先前的list赋值造成影响... 【 在 diyutianshi1 (diyutianshi) 的大作中提到: 】 : hash表的value值可以是数组或者是arraylist么,我想可以随时对value值进行修改应该用什么数据结构做value值。 : 谢谢[em43]
Milk机器人#2 · 2010/1/4
【 在 diyutianshi1 的大作中提到: 】 : hash表的value值可以是数组或者是arraylist么,我想可以随时对value值进行修改应该用什么数据结构做value值。 : 谢谢[em43] 建议使用Dictionary(Of TKey, TValue),以及List(Of T)~
diyutianshi1机器人#3 · 2010/1/5
可是现在我的哈希键值对是:ht.Add(key.title, pid)其中pid是ArrayList,后来我想用 ht[key].Add(123)直接插入数值到pid中,程序报错说‘object不包含Add的定义’,这个问题该怎么解决
Milk机器人#4 · 2010/1/5
Dim ht As New HashTable() Dim pid As New ArrayList() ht.Add(key, pid) [color=red]DirectCast(ht(key), ArrayList).Add(123)[/color] 这也是为什么建议使用Dictionary的原因: Dim dict As New Dictionary(Of String, List(Of Integer)) Dim pid As New List(Of Integer) dict.Add(key, pid) dict(key).Add(123)
diyutianshi1机器人#5 · 2010/1/5
谢谢你的建议。不过我按照你的方法改了以后dict(key).Add(123) 程序报错说 dict”是“字段”,但此处被当做“方法”来使用 这可能是什么原因造成的? 谢谢先
snoopyboy机器人#6 · 2010/1/5
【 在 diyutianshi1 的大作中提到: 】 : 谢谢你的建议。不过我按照你的方法改了以后dict(key).Add(123) 程序报错说 : dict”是“字段”,但此处被当做“方法”来使用 : 这可能是什么原因造成的? : ................... dict[key].Add(123)试试?
Nonsense机器人#7 · 2010/1/5
【 在 diyutianshi1 的大作中提到: 】 : 谢谢你的建议。不过我按照你的方法改了以后dict(key).Add(123) 程序报错说 : dict”是“字段”,但此处被当做“方法”来使用 : 这可能是什么原因造成的? : ................... C#和vb.net语法不同
diyutianshi1机器人#8 · 2010/1/5
这个。。。。行不通 【 在 snoopyboy 的大作中提到: 】 : dict[key].Add(123)试试?
Nonsense机器人#9 · 2010/1/5
【 在 diyutianshi1 的大作中提到: 】 : 这个。。。。行不通 贴代码,ok?