实现泛型数组可以对Integer和String类型的数组排序

来源:互联网 发布:java从入门到实践 编辑:程序博客网 时间:2024/06/16 11:06

题目

这里写图片描述

解析

此题主题就是实现一个泛型类,使之能持有一个数组,数组类型有泛型类的类型参数决定,所以我们可以为泛型类在域中添加一个数组。再来说排序,我们这里为了解决问题,就不自己实现排序了,直接使用Arrays类中static sort()排序算法,同时添加一个add()方法可以实现对域中数组进行添加,最后重写这个类的toString()使之能够按照格式输出我们的想要的数组样式。

代码

package com.study.mengyi.operate;import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 泛型数组类,可以添加,排序 * @ClassName MoreArray * @Description * @Author Meng Yi * @Date 2017年8月2日 上午10:20:59 * @param <T> */class MoreArray<T>{    private T[] array;    private int index;    @SuppressWarnings("unchecked")    public MoreArray(int size){        array = (T[]) new Object[size];    }    public void add(T item){        array[index++]=item;    }    public T[] getArray(){        return array;    }    public int getInt(){        return index;    }    public void sort(){        /**         * Arrays.sort()的排序方法,第三个参数为数组的实际的长度         * 若不指定实际长度,会因为数组中的空元素排序,造成抛出NullPointerException         */        Arrays.sort(array, 0, index);    }    /**     * 自定义格式化输出数组     */    public String toString(){        StringBuilder result = new StringBuilder();        for(T item:array)            if(item!=null){            String str = String.valueOf(item)+'\n';            result.append(str);            }        return result.toString();    }}/** * * @ClassName ZhiZhang * @Description * @Author Meng Yi * @Date 2017年8月2日 上午10:23:35 */public class ZhiZhang {    public static void main(String[] args){        Scanner input = new Scanner(System.in);        int num = input.nextInt();        MoreArray<Integer> integerArray = new MoreArray<Integer>(num);        MoreArray<String>  stringArray  = new MoreArray<String>(num);        for(int i=0;i<num;i++){            String str = input.next();            if(isNum(str)) integerArray.add(Integer.parseInt(str));            else           stringArray.add(str);        }        integerArray.sort();        stringArray.sort();        System.out.println(integerArray.toString()+stringArray.toString());    }    /**     * 判断字符串是否是数值型     * @param str     * @return     */    public static boolean isNum(String str){        Pattern pattern = Pattern.compile("[0-9]*");           Matcher isNum = pattern.matcher(str);           if( !isNum.matches() ){               return false;           }           return true;    }}

运行结果

这里写图片描述

总结

注意Java的中泛型是由于擦除的方法实现的,所以我们不能直接 new T[],因为T的类型在编译时期类型检查之后被擦除了,所以在运行时无法获取T的实际类型,所以无法new这个类型数组,所以只能生成Object数组,然后转型为T[],其实这里转型在实际上并没转型,只是为了让能通过编译!

阅读全文
1 0
原创粉丝点击