从完成《JAVA编程思想》第四版 流程控制 练习10的过程中学到的

      最近在学习《JAVA编程思想》第四版,做练习是必须的,而在流程控制这一章的练习10的完成过程中,不觉学到了一些东东,值得我记录下来。也许这些东西在后续的章节中会出现,所解决的问题也不成为问题,但毕竟这个过程是我学习的经历,需要我记录。

 

练习10: A vampire number has an even number of digits and is formed by multiplying a pair of numbers containing half the number of digits of the result. The digits are taken from the original number in any order. Pairs of trailing zeroes are not allowed. Examples include: 1260 = 21 * 60, 1827 = 21 * 87, 2187 = 27  * 81. Write a program that finds all the 4-digit vampire numbers. (Suggested by Dan Forhan.)

 

一个实现方法:

    

 

这个代码不是我写的,不过我最初的实现思想与此类似。运行结果

        1260 = 21 * 60
        1395 = 15 * 93
        1435 = 41 * 35
        1530 = 51 * 30
        1827 = 87 * 21
        2187 = 27 * 81
        6880 = 86 * 80
        6880 = 80 * 86

 

       最后两个6880,虽然算不上是错误,但心里总觉得不爽。原因很简单,显然是程序没有识别86*80和80*86是一码事。我想到的解决办法也有两种,一是保存结果,看到相同的数,如6880,删除相关数据,另一个就是在源头识别86*80==80*86。水平有限,或者是为了学习(美其名曰),我选择了后者,具体想法是对于1001~9999中的每个数,将所有可能参与乘法的两个操作数对放到一个Set中,这个过程消除所有重复的可能,包括a*b和b*a这种。方法很笨,却让我学到了一些东东。

 

        实际过程中我用泛化的ArrayList,之所以没用Set,是因为我还没搞懂(^-^)。我自定义了一个类OpPair,用来存储两个乘法操作数,准备override equals()方法,用来使用ArrayList的contains方法判断对象是否已存在与arraylist中,象这样:

 

主程序通过调用这个函数将操作数对加入到arraylist中,确保没有重复的。没想到却出现了不少错误,也让我学到了(赚到了:))

 

一. 方法调用object传递的是引用,Arraylist中保留的也只是引用

       其实这在前面已经学过了,在我的另一个笔记中也着重强调了一下,到了实际问题中还是会忘记啊!再次加强一下!

       原因是我在调用的时候只定义了一个OpPair对象,而后通过改变里面的具体值实现不同操作数对,再调用addOpPair,象这样

 

结果显然是不对的。原来得这样

  

出了错误才恍然大悟,哎。。。看来还得加强学习和实践

 

二. equals的override得这样:public boolean equals(Object o),参数得用Object

      原以为解决了上面那个问题就万事大吉了,结果还是不行。查找原因,是在调用contains出现了问题。翻看API,contains的签名是 public boolean contains(Object o)。一切皆对象,应该没有问题啊,通过o.equals()和多态,肯定能调用到我自己的类的equals()啊。我的类初始定义:

 

以为没有问题,细想才发现override不成功,签名不一致,变成重载了,而contains调用的是Object的equals方法。Object的equals方法参数自然是Object,看来得这样

 

一试,果不其然。

 

      问题解决了,有点疑问:Arraylist既然泛化了,为什么这个方法泛化呢?或者是我调用错了,没调用到泛化过的类似函数?

 

我的代码

 

运行结果

 1260 = 21 * 60
1395 = 15 * 93
1435 = 41 * 35
1530 = 51 * 30
1827 = 87 * 21
2187 = 27 * 81
6880 = 86 * 80

突然发现自己的方法原来是那么的笨、重,哈哈,管它呢,暂时学到了就行,慢慢的就好了!结束了~~

 

简单改了下,不妨在OpPair中把两个操作数排个序,小的在op1,大的在op2,addOpPair就可以这样

运行结果

1260 = 21 * 60
1395 = 15 * 93
1435 = 35 * 41
1530 = 30 * 51
1827 = 21 * 87
2187 = 27 * 81
6880 = 80 * 86

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值