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