Think in java-Array16

对于数组我们可以使用Arrays.fill()进行填充或者部分填充,但是这种方式只能填充称为单一的值,不能动态生成,所以需要编写生成器进行数据的生成。

1.按照顺序生成的生成器
package com.mao.thinkinjava.generator;

public class CountingGenerator {
    //private static Random rm = new Random(47);
    public static class Character implements Generator<java.lang.Character>{
        public  static char[] chars = ("abcdefgh"+"ABCDEFG").toCharArray();
        int value = -1;
        @Override
        public java.lang.Character generate() {
            value=(value+1)%chars.length;
            return chars[value];
        }
    }

    public static class String implements Generator<java.lang.String> {
        //后面RandomGenerator这里可以进行替换
         Generator<java.lang.Character> cg = new Character();
        private int length = 4;
        public String(){}
        public String(int length){this.length = length;}
        @Override
        public java.lang.String generate() {
            char[] res = new char[length];
             //错误写法,不能用于赋值
//            for(char c : res){
//                c = cg.generate();
//            }
            for(int i=0;i<length;i++){
                res[i] = cg.generate();
            }
            return new java.lang.String(res);
        }
    }
}
2.按照随机的策略进行生成
package com.mao.thinkinjava.generator;

import java.util.Random;

public class RandomGenerator {
    public static Random rm = new Random(47);
    public static class Character implements Generator<java.lang.Character>{
        char[] chars = CountingGenerator.Character.chars;//复用了CountingGenerator里面的。
        @Override
        public java.lang.Character generate() {
            return chars[rm.nextInt(chars.length)];
        }
    }

    public static class String extends CountingGenerator.String{
        { cg = new Character(); } //这是父类的成员变量,必须写在初始化块。
        public String(){}
        public String(int length){super(length);}
    }
}
3.测试类
package com.mao.thinkinjava.generator;

public class TestGenerator {
    public  void test(Class<?> generatorsClass){
        //generatorsClass 也算是一个对象,所以他也可以getClass,结果就是class java.lang.Class
        //可以这么理解Class是JDK里面的一个类,这个类的对象可以容纳别的类的字节码,Class类本身就有字节码。
//        Class<Class> aClass = (Class<Class>) generatorsClass.getClass();
//        System.out.println(aClass);
        Class<?>[] classes = generatorsClass.getClasses();
        for(Class clazz : classes){
            try {
                Generator<?> gen = (Generator<?>)clazz.newInstance();
                System.out.println(gen.getClass());
                for(int i=0;i<10;i++){
                    Object generated = gen.generate();
                    System.out.println(generated);
                }
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new TestGenerator().test(RandomGenerator.class);
    }
}

对于不同的生成需求只需要更改生成器即可,不同的生成器代表不同的生成策略。

4.Collection.reverseOrder()
Integer[] a = {1,2,4,4,5,6};
Comparator<Object> objectComparator = Collections.reverseOrder();
//这里对于实现了Comparable的对象,Collections.reverseOrder()才有效果。Arrays.sort(a,objectComparator);
System.out.println(Arrays.toString(a));
5.使用生成器生成对象数组

public class Generated {
   public static <T> T[] array(T[] a,Generator<T> gen){
       for(int i=0;i<a.length;i++){
           a[i] = gen.generate();
       }
       return a;
   }

   public static <T> T[] array(Class<T> clazz,Generator<T> gen,int size){
       //这样行不通,因为类型擦除;
      // T[] a = new T[size];
       T[] a = (T[])java.lang.reflect.Array.newInstance(clazz,size);
       for(int i=0;i<a.length;i++){
           a[i] = gen.generate();
       }
       return a;
   }

    public static void main(String[] args) {
        Character[] chars = Generated.array(new Character[10], new CountingGenerator.Character());
        System.out.println(Arrays.toString(chars));
        String[] ss = Generated.array(String.class, new CountingGenerator.String(),10);
        System.out.println(Arrays.toString(ss));
    }
}
题外:lambada
  • lambada实际类型是接口,本质是将一段代码赋值给了一个变量。
		 Comparable<Integer> com=(a)->a;
        int i = com.compareTo(3);
        System.out.println(i);

        //lambada类似于C++里面的回调函数。
        Comparator<Integer> comparator = (o1,o2)->o1-o2;
        int compare = comparator.compare(3, 4);
        System.out.println(compare);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值