A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曹睿翔 于 2013-5-20 14:59 编辑

前几天“圣手书生”问到,怎么扩展一个函数,让其能求出任意数字类型的数组求最大值。可惜当时没解决出来。
有两种思路:
一种是重载方式(就是有几种数字数组就写几个重载方法,因为Arrays中的toString()方法就是这么干的(黄玉昆给的解释,很好),毕竟基本数据类型没封装类好操作)。
另一种是利用反射(开始我想的也是这种,可是没有想到结合集合去解决在数组类型未知时怎么比较大小,问了下老师得到了满意的答复)
不能像这样用泛型getMax(T[]),因为T[]不接收基本类型的数组。
代码如下:
//这是关键:因为不确定数组的数据类型,无法用>比较大小,可以考虑是用集合工具了Collections的max()方法
  1. public static Object getMax(Object arr) {
  2.                 Class clazz = arr.getClass();
  3.                 List list = new ArrayList();
  4.                 int length = 0;
  5.                 if (clazz.isArray()) { // 判断是不是数组
  6.                         length = Array.getLength(arr);
  7.                         Class componentType = clazz.getComponentType(); // 获得数组的类型
  8.                         if (componentType == int.class || componentType == double.class
  9.                                         || componentType == float.class
  10.                                         || componentType == long.class) {
  11.                                 for (int i = 0; i < length; i++) {
  12.                                         // 如果是基本类型的数字数组,需要手动添加到集合
  13.                                         list.add(Array.get(arr, i));
  14.                                 }
  15.                         } else if (componentType == Integer.class
  16.                                         || componentType == Float.class
  17.                                         || componentType == Double.class
  18.                                         ||componentType == Long.class) {
  19.                                 // 如果是包装类型,用Arrays的asList()方法
  20.                                 Object[] newArr = (Object[]) Array.newInstance(componentType,
  21.                                                 length);
  22.                                 System.arraycopy(arr, 0, newArr, 0, length);
  23.                                 list = Arrays.asList(newArr);
  24.                         } else {
  25.                                 throw new RuntimeException("请出入数字数组");
  26.                         }

  27.                 } else {
  28.                         throw new RuntimeException("请输入数组");
  29.                 }
  30.                 return Collections.max(list);
  31.         }

  32.         public static void main(String[] args) {
  33.                 int[] ins = { 1, 2, 3, 4, 17 };
  34.                 double[] ds = { 123.323, 123.54, 328.0 };
  35.                 float[] fs = { 123.5f, 32.4f };
  36.                 Integer[] in = { 1, 2, 3, 4, 17 };
  37.                 Double[] d = { 123.323, 123.54, 328.0 };
  38.                 System.out.println(getMax(ins));
  39.                 System.out.println(getMax(ds));
  40.                 System.out.println(getMax(fs));
  41.                 System.out.println(getMax(in));
  42.                 System.out.println(getMax(d));
  43.         }
  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

6 个回复

倒序浏览
曹帮主。我来帮顶了! 我还欠你一些东西。。。最近忙着交入学测试题了!对不住你!晚点就补齐!
回复 使用道具 举报
哇,这个可以有{:soso_e179:}
回复 使用道具 举报
看来我的思路,还是比较正确的。。。

点评

你对在了用collections工具类,哈哈,不错不错  发表于 2013-5-20 17:34
回复 使用道具 举报
刘胜寒 发表于 2013-5-20 17:20
看来我的思路,还是比较正确的。。。

还不是被你给坑了。每个数组里面包含各种number的子类。
回复 使用道具 举报
反射数组的神器:Array工具类。。。老曹果然厉害。。。
回复 使用道具 举报
//这是关键:因为不确定数组的数据类型,无法用>比较大小,可以考虑是用集合工具了Collections的max()方法
对这句话有点小疑问:
是否可以使用工具类Arrays。sort(Object[] arr);//先排序在取最后一个。。。
关键是不是可以使用Arrays来操作。。。

点评

用Arrays工具类也绕不过去,还没Collections好用  发表于 2013-5-21 08:43
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马