泛型方法求二维字符串数组最大值的测试实现咨询
嘿,我来帮你搞定这个泛型方法的测试问题,顺便先揪出你代码里一个容易忽略的小bug!
首先修正你的max方法
你当前的循环逻辑有问题:i从1开始、j也从1开始,会直接跳过第一行除了list[0][0]的所有元素,以及第一列除了list[0][0]的所有元素——比如你的测试数组里的"green"和"yellow"根本不会参与比较,最后返回的max永远是"red",这显然不符合需求。
这里给你优化后的健壮版本,会遍历所有元素,还加了空指针防护:
public static <E extends Comparable<E>> E max(E[][] list) { // 先判断数组合法性,避免空指针或空数组 if (list == null || list.length == 0 || list[0].length == 0) { throw new IllegalArgumentException("二维数组不能为空,且至少包含一个元素"); } E max = list[0][0]; // 增强for循环遍历每一行 for (E[] row : list) { // 遍历当前行的每个元素 for (E element : row) { // 用当前元素和max比较,更新max if (element.compareTo(max) > 0) { max = element; } } } return max; }
怎么测试这个方法?
测试其实非常简单,不需要额外的复杂遍历,直接调用静态方法+验证结果就行,步骤如下:
- 把max方法和测试代码放在同一个类里(或者单独封装成工具类)
- 在
main方法里创建你的测试数组,调用max方法并获取结果 - 打印结果,或者用断言验证是否符合预期
给你写个完整的测试示例:
public class GenericMaxDemo { public static void main(String[] args) { // 你的测试字符串数组 String[][] list1 = {{"red", "green"}, {"yellow", "blue"}}; // 调用max方法获取最大值 String stringMax = max(list1); // 打印结果 System.out.println("字符串数组的最大值:" + stringMax); // 用断言验证(运行时需要添加-ea参数开启断言) assert stringMax.equals("yellow") : "字符串最大值不符合预期"; // 再测试一个整数数组,验证泛型的通用性 Integer[][] list2 = {{12, 5, 8}, {3, 19, 7}, {22, 4}}; Integer intMax = max(list2); System.out.println("整数数组的最大值:" + intMax); assert intMax == 22 : "整数最大值不符合预期"; } // 把优化后的max方法放在这里 public static <E extends Comparable<E>> E max(E[][] list) { if (list == null || list.length == 0 || list[0].length == 0) { throw new IllegalArgumentException("二维数组不能为空,且至少包含一个元素"); } E max = list[0][0]; for (E[] row : list) { for (E element : row) { if (element.compareTo(max) > 0) { max = element; } } } return max; } }
测试时的小提示
- 运行带断言的代码时,需要在JVM参数里加上
-ea(开启断言),否则断言语句不会生效 - 可以多测试几种类型的数组(比如Double、Character),验证泛型方法的通用性
- 如果数组里有
null元素,还可以考虑在方法里加null判断,避免NullPointerException
内容的提问来源于stack exchange,提问作者GMM
相关产品推荐
相关产品推荐

