泛型SimpleHistogram构造器优化:解决数组入参适配问题
泛型直方图构造器适配数组输入的解决方案
问题核心
当前SimpleHistogram类仅提供了基于List的初始化构造器,但测试用例传入的是Character[]数组,没有匹配的构造器导致编译错误;如果单独为Character[]编写构造器,会破坏泛型的通用性,无法适配其他类型的数组。
解决思路
新增一个支持泛型数组输入的构造器,通过将数组转换为List来复用现有构造器的统计逻辑,既满足数组输入需求,又保持泛型的通用性。同时修正原代码中的逻辑错误,补充必要的接口方法。
修改后的完整代码
class SimpleHistogram<T> implements Histogram<T>, Iterable<T> { private final Map<T, Integer> bins = new HashMap<>(); public SimpleHistogram() { this(List.of()); } // 新增支持泛型数组的构造器 public SimpleHistogram(T[] items) { this(Arrays.asList(items)); } SimpleHistogram(List<? extends T> items) { for (T item : items) { Integer count = bins.getOrDefault(item, 0); bins.put(item, count + 1); } } @Override public void setCount(T item, int count) { bins.put(item, count); } @Override public Iterator<T> iterator() { return bins.keySet().iterator(); } @Override public int getTotalCount() { // 修正原逻辑错误:总计数是所有元素出现次数的总和,而非不同元素的数量 return bins.values().stream().mapToInt(Integer::intValue).sum(); } // 补充Histogram接口必需的getCount方法 @Override public int getCount(T item) { return bins.getOrDefault(item, 0); } }
关键说明
- 数组构造器实现:通过
Arrays.asList(items)将泛型数组转换为List,直接调用现有构造器完成统计逻辑,避免重复代码 - 修复总计数逻辑:原代码中
bins.size()返回的是不同元素的数量,不符合getTotalCount的语义,改为对Map中所有值求和 - 补充接口方法:测试用例中调用了
getCount方法,原代码未实现该接口方法,必须补充以保证编译通过
修改后,测试用例中的new SimpleHistogram<>(target)可以正常编译运行,无需改动测试代码。
内容的提问来源于stack exchange,提问作者user18984687
相关产品推荐
相关产品推荐

