日期:2014-05-20  浏览次数:20667 次

Hashtable的已在元素无法找到的问题
这个问题是在做这道习题时出现的:
3-20 商店中每种商品都有标价。例如,一朵花的价格是2元,一个花瓶的价格是5元。为了吸引顾客,商店提供了一组优惠商品价。优惠商品是把一种或多种商品分成一组,并降价销售。例如,3朵花的价格不是6元而是5元。2个花瓶加1朵花的优惠价是10元。试设计一个算法,计算出某一个顾客所购商品应付的最少费用。

这是王晓东《计算机算法设计与分析》一书第3章动态规划里的一道课后习题。习题本身比较简单,主要涉及的算法是备忘录方法。我关键想问的是   我实现算法过程中所用的Hashtable出现的找不到已在元素的问题,我在类中已经重载了Hashcode(),以及equals()。
这个程序,涉及到两个输入文件,一个是商品列表merchandise,一个是优惠策略policy。也即有多少种商品及其单价,和,怎样的商品组合的优惠价格是多少,这些信息是动态输入的。
程序根据,举个例子,比如设定好3种商品,以及3条优惠策略,那么可知对于用户购买要求(a,b,c)--0商品a件,1商品b件,2商品c件,它的求解递归式是:
Cost(a,b,c)=min{   Cost(a-x,b-y,c-z)+totalPrice(x,y,z)   }
其中,(x,y,z)是任一条优惠策略(为统一处理单买的情况,将单买也作为一条优惠策略),totalPrice为该条策略的总价。如果a-x <0就置为0,其余类似。思想便是通过策略降低问题规模动规求解。
因为不知道商品有多少种,因而cost矩阵的维数不能事先确定。但我们所要的只是在计算未知请求时降低规模后,能够给出已经计算出的小规模请求的最优耗费,所以可以采用以请求向量,如上例子中的(a,b,c)作为key值,Cost(a,b,c)作为value的Hashtable来存储已经计算得到的值,用备忘录方法实现。
具体不再介绍了。进入正题,郁闷的是,我用Hashtable来存储cost值时,明明已经加入到Hashtable的请求向量却在需要时无法得到,比如(1,1,1)已经算过,因而加入到了Hashtable中,下次在算(1,2,1)时利用某策略后比如降为(1,1,1)后检查是否已经计算(已计算直接返回而不需计算),竟然找不到!有时其他情况却又可以找到。后来无奈,自己写了一个可以按需设定维数的可变维数组(一维分段实现多维)代替Hashtable,结果没有问题。
所以总结一下问题,java的Hashtable为何会找不到已在的元素,在类中已经重载了Hashcode(),以及equals()。。应该是我的程序的问题,但是用自己写的多维数组类代替Hashtable在程序中的用途,程序又没有问题。所以还请各位java高人热心指点!万分感谢!
这是一个300行的小程序。我把两个实现(Hashtable、多维数组类)都放在上面,以做对比。商品信息的数据由文件读入,用户请求界面输入。还请高手们不厌其烦,看看代码,帮帮在下。感谢感谢!

先将两个输入文件的结构展示如下:

文件merchandise.txt

total   ----总的商品个数
price[0]---id=0   的商品价格
price[1]---id=1  
.
.
price[total-1]

文件policy.txt

total   ----策略条数
maxRefer---每条策略最多涉及的商品种数
referNum   id   num[id]   ...   id   num[id]   totalPrice
--该条策略涉及的商品种数   id   需要购买id商品的个数...   总和价格(应当比单买便宜)

示例文件数据如下:

文件merchandise.txt
3
2
5
9

文件policy.txt

3
3
2   0   1   1   2   10
2   1   2   2   1   6
3   0   1   1   1   2   1   11

运行过程中的用户购买请求输入示例:
3
0 1   --id=0商品购买1件
1 3   --id=1...     3
2 2   --id=2...     2

附上程序如下:---因为不允许贴子内容太长,请继续看
Hashtable的已在元素无法找到的问题1

------解决方案--------------------
太长了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
------解决方案--------------------
会不会问问题呀?这么长谁看得完呀!找出核心问题
------解决方案--------------------
比旧社会的裹脚布还长。。。