Java一维数组操作类,可以加入任意类型的数据

源于《Java开发实战经典》Chapter10的习题:

按照要求定义一个操作类:要求完成一个一维数组操作类,其中可以加入任意类型的数据,数组具体的操作类型由程序外部决定,并且可以实现查询功能。

查了下网上的一些回答,很大部分曲解了题目的意思,它是要求一维数组的每一位都可以是任意的class,可以是Integer,Float,Object或者自己定义的类Person等。

具体实现:

  1. class Data<T>{  
  2.     private T info;  
  3.     public Data(T info){  
  4.         this.info=info;  
  5.     }  
  6.     public String toString(){  
  7.         return this.info.toString();  
  8.     }  
  9.     public T getInfo(){  
  10.         return info;  
  11.     }  
  12. }  
  13. class Operation{  
  14.     private Data<?>[] datas;  
  15.     private int foot;  
  16.     public Operation(int len){  
  17.         if(len>0){  
  18.             this.datas=new Data[len];  
  19.         }else{  
  20.             this.datas=new Data[1];  
  21.         }  
  22.     }  
  23.     public void add(Data<?> data){  
  24.         if(this.foot<this.datas.length){  
  25.             this.datas[this.foot]=data;  
  26.             this.foot++;  
  27.         }else{  
  28.             System.out.println("数组已满");  
  29.         }  
  30.     }  
  31.     public void search(Object x){  
  32.         int i=-1;  
  33.         boolean flag=false;  
  34.         for(Data<?> data:this.datas){  
  35.             i++;  
  36.             if(data.getInfo().getClass()==x.getClass()&&data.toString().equals(x.toString())){  
  37.                 if(flag==false){  
  38.                     System.out.print("存在");  
  39.                     flag=true;  
  40.                 }  
  41.                 System.out.print("\tdata["+i+"]");  
  42.             }     
  43.         }  
  44.         if(flag==false){  
  45.             System.out.println("不存在");  
  46.         }else{  
  47.             System.out.println();  
  48.         }  
  49.     }  
  50.     public void print(){  
  51.         int i=0;  
  52.         for(Data<?> data:this.datas){  
  53.             System.out.println("data["+(i++)+"]="+data.toString()+"\t数据所属类:"+data.getInfo().getClass().toString().split(" ")[1]);  
  54.         }  
  55.     }  
  56. }  
  57. class Person{  
  58.     private String name;  
  59.     public Person(String name){  
  60.         this.name=name;  
  61.     }  
  62.     public String toString(){  
  63.         return name;  
  64.     }  
  65. }//写个自己定义的Peron类  
  66. public class Chapter10_1{  
  67.     public static void main(String args[]){  
  68.         Operation op=new Operation(6);  
  69.         op.add(new Data<Integer>(10));  
  70.         op.add(new Data<Float>(12.0f));  
  71.         op.add(new Data<String>("13"));  
  72.         op.add(new Data<Integer>(10));  
  73.         op.add(new Data<Double>(12.0));  
  74.         op.add(new Data<Person>(new Person("张三")));  
  75.         op.print();  
  76.         op.search(10);  //查询Internet类  
  77.         op.search(12.0);//查询Double类  
  78.         op.search(12.0f);//查询Float类  
  79.         op.search("13");//查询String类  
  80.         Person a=new Person("李四");  
  81.         op.search(a);//查询Person类  
  82.     }  
  83. }  

运行结果:

 

Java一维数组操作类,可以加入任意类型的数据

 

事实上可以不这么复杂。其实Java新特征之一:可变参数传递就可以简单地实现。具体代码:

 

  1. class Person{  
  2.     private String name;  
  3.     public Person(String name){  
  4.         this.name=name;  
  5.     }  
  6.     public String toString(){  
  7.         return this.name;  
  8.     }  
  9. }  
  10. public class Chapter10_1{  
  11.     public static void main(String args[]){  
  12.         Person p=new Person("张三");  
  13.         fun(11.34,13.5f,10,"12",p);  
  14.     }  
  15.     public static void fun(Object...args){  
  16.         for(int i=0;i<args.length;i++){  
  17.             System.out.print(args[i]+"、");  
  18.         }  
  19.     }  
  20. }  


执行结果:11.34、13.5、10、12、张三、

这样可以构建任意个数的的一维数组,如果已经知道要构建的数组的大小和内容,直接

Object[] a={11.34,13.5f,10,"12",p}也是没有问题的。要完成题目的要求,就只需要把它写成名为Operation类,加入search就好了,具体参照第一部分的代码。只是这样就不是用到了泛型的知识,而是利用了Object可以接受一切类的性质了。