收银程序output2方法优化求助:按需输出找零对应面额
解决Cash Register找零动态输出的问题
嘿,我完全懂你不想写那种冗长又死板的硬编码输出——每次加新面额都要改输出语句,太麻烦了!这里有个更灵活的方法,核心思路是把面额信息和对应的数量变量打包成一组,然后遍历这组数据,只输出数量大于0的项。
举个Java的实现例子,假设你已经算出了各个面额的数量(hundred, fifty这些变量):
首先,我们可以先定义一个简单的结构来存储面额的描述和对应的数量(如果用Java 16+,可以用record,非常方便):
record Denomination(String name, int count) {}
然后,把所有的面额和对应的数量放进一个列表里:
List<Denomination> denominations = List.of( new Denomination("hundred dollar bills", hundred), new Denomination("fifty dollar bills", fifty), new Denomination("twenty dollar bills", twenty), new Denomination("ten dollar bills", ten), new Denomination("five dollar bills", five), new Denomination("one dollar bills", one), // 如果有硬币的话也可以加进来 new Denomination("quarters", quarters), new Denomination("dimes", dimes), new Denomination("nickels", nickels), new Denomination("pennies", pennies) );
接下来,遍历这个列表,只构建有数量的部分:
StringBuilder changeOutput = new StringBuilder("Your change will be: "); boolean firstItem = true; for (Denomination d : denominations) { if (d.count() > 0) { if (!firstItem) { changeOutput.append(", "); } changeOutput.append(d.count()).append(" ").append(d.name()); firstItem = false; } } // 最后输出结果 System.out.println(changeOutput);
这样做的好处:
- 不用硬编码每个面额的输出语句,后续要加新面额(比如2美元纸币),只需要在列表里加一行就行
- 自动跳过数量为0的面额,完全符合你的需求
- 代码更整洁,维护起来轻松很多
如果你的Java版本低于16,没法用record,可以用一个简单的静态内部类代替:
static class Denomination { String name; int count; Denomination(String name, int count) { this.name = name; this.count = count; } }
用法和上面完全一样。
另外,如果你想让输出的格式更友好(比如最后一项用“and”连接),可以在遍历的时候稍微调整逻辑,但核心思路还是一样的——通过数据驱动的方式来生成输出,而不是硬编码每一种情况。
内容的提问来源于stack exchange,提问作者Alex Suero
相关产品推荐
相关产品推荐

