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

题目

这里写图片描述

解析

此题主题就是实现一个泛型类,使之能持有一个数组,数组类型有泛型类的类型参数决定,所以我们可以为泛型类在域中添加一个数组。再来说排序,我们这里为了解决问题,就不自己实现排序了,直接使用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[],其实这里转型在实际上并没转型,只是为了让能通过编译!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值