Java一维数组操作类,可以加入任意类型的数据
源于《Java开发实战经典》Chapter10的习题:
按照要求定义一个操作类:要求完成一个一维数组操作类,其中可以加入任意类型的数据,数组具体的操作类型由程序外部决定,并且可以实现查询功能。
查了下网上的一些回答,很大部分曲解了题目的意思,它是要求一维数组的每一位都可以是任意的class,可以是Integer,Float,Object或者自己定义的类Person等。
具体实现:
- class Data<T>{
- private T info;
- public Data(T info){
- this.info=info;
- }
- public String toString(){
- return this.info.toString();
- }
- public T getInfo(){
- return info;
- }
- }
- class Operation{
- private Data<?>[] datas;
- private int foot;
- public Operation(int len){
- if(len>0){
- this.datas=new Data[len];
- }else{
- this.datas=new Data[1];
- }
- }
- public void add(Data<?> data){
- if(this.foot<this.datas.length){
- this.datas[this.foot]=data;
- this.foot++;
- }else{
- System.out.println("数组已满");
- }
- }
- public void search(Object x){
- int i=-1;
- boolean flag=false;
- for(Data<?> data:this.datas){
- i++;
- if(data.getInfo().getClass()==x.getClass()&&data.toString().equals(x.toString())){
- if(flag==false){
- System.out.print("存在");
- flag=true;
- }
- System.out.print("\tdata["+i+"]");
- }
- }
- if(flag==false){
- System.out.println("不存在");
- }else{
- System.out.println();
- }
- }
- public void print(){
- int i=0;
- for(Data<?> data:this.datas){
- System.out.println("data["+(i++)+"]="+data.toString()+"\t数据所属类:"+data.getInfo().getClass().toString().split(" ")[1]);
- }
- }
- }
- class Person{
- private String name;
- public Person(String name){
- this.name=name;
- }
- public String toString(){
- return name;
- }
- }//写个自己定义的Peron类
- public class Chapter10_1{
- public static void main(String args[]){
- Operation op=new Operation(6);
- op.add(new Data<Integer>(10));
- op.add(new Data<Float>(12.0f));
- op.add(new Data<String>("13"));
- op.add(new Data<Integer>(10));
- op.add(new Data<Double>(12.0));
- op.add(new Data<Person>(new Person("张三")));
- op.print();
- op.search(10); //查询Internet类
- op.search(12.0);//查询Double类
- op.search(12.0f);//查询Float类
- op.search("13");//查询String类
- Person a=new Person("李四");
- op.search(a);//查询Person类
- }
- }
运行结果:
事实上可以不这么复杂。其实Java新特征之一:可变参数传递就可以简单地实现。具体代码:
- class Person{
- private String name;
- public Person(String name){
- this.name=name;
- }
- public String toString(){
- return this.name;
- }
- }
- public class Chapter10_1{
- public static void main(String args[]){
- Person p=new Person("张三");
- fun(11.34,13.5f,10,"12",p);
- }
- public static void fun(Object...args){
- for(int i=0;i<args.length;i++){
- System.out.print(args[i]+"、");
- }
- }
- }
执行结果:11.34、13.5、10、12、张三、
这样可以构建任意个数的的一维数组,如果已经知道要构建的数组的大小和内容,直接
Object[] a={11.34,13.5f,10,"12",p}也是没有问题的。要完成题目的要求,就只需要把它写成名为Operation类,加入search就好了,具体参照第一部分的代码。只是这样就不是用到了泛型的知识,而是利用了Object可以接受一切类的性质了。