Generator (生成器)彙總

/**
 * Created by Panda on 2018/5/29.
 */
//生成器:一種專門負責創建對象的類。工廠方法模式的一種應用
public interface Generator <T>{
    T next();
}

/**
 * Created by Panda on 2018/5/29.
 */
public class GeneratorTest {
    public static int size = 10;

    public static void test(Class<?> surroundingClass) {
        for (Class<?> type : surroundingClass.getClasses()) {
            System.out.println(type.getSimpleName() + ": ");
            try {
                Generator<?> generator = (Generator<?>) type.newInstance();
                for (int i = 0; i < size; i++) {
                    System.out.print(generator.next() + " ");
                }
                System.out.println();
            } catch (Exception e) {
                throw  new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        test(CountingGenerator.class);
    }
}

package 生成器;

/**
 * Created by Panda on 2018/5/29.
 */
//數據生成器
public class CountingGenerator {

    //布爾類型
    public static class Boolean implements Generator<java.lang.Boolean>{
        private boolean value=false;
        @Override
        public java.lang.Boolean next() {
            value=!value;
            return value;
        }
    }

    //Byte類型
    public static class Byte implements Generator<java.lang.Byte>{
        private byte value=0;
        @Override
        public java.lang.Byte next() {
            return value++;
        }
    }

    //字符類型
    static char[] chars=("abcdefghijklmnopqrstuvwxyz"+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
    public static class Character implements Generator<java.lang.Character>{
        int index=-1;
        @Override
        public java.lang.Character next() {
            index=(index+1)%chars.length;
            return chars[index];
        }
    }

    //字符串類型
    public static class String implements Generator<java.lang.String>{
        private int length=7;
        Generator<java.lang.Character> characterGenerator =new Character();
        public String(){}
        public String(int length){this.length=length;}
        @Override
        public java.lang.String next() {
            char[] buf=new char[length];
            for (int i = 0; i <length ; i++) {
                buf[i]=characterGenerator.next();
            }
            return new java.lang.String(buf);
        }
    }

    //short類型
    public static class Short implements Generator<java.lang.Short>{
        private short value=0;
        @Override
        public java.lang.Short next() {
            return value++;
        }
    }

    //Integer 類型
    public static class Integer implements Generator<java.lang.Integer>{
        private int value=0;
        @Override
        public java.lang.Integer next() {
            return value++;
        }
    }

    //long類型
    public static class Long implements Generator<java.lang.Long>{
        private long value=0;
        @Override
        public java.lang.Long next() {
            return value++;
        }
    }

    //float類型
    public static class Float implements Generator<java.lang.Float>{
        private float value=0;
        @Override
        public java.lang.Float next() {
            float result=value;
            value+=1.0;
            return result ;
        }
    }

    //Double類型
    public static class Double implements Generator<java.lang.Double>{
        private double value=0;
        @Override
        public java.lang.Double next() {
            double result=value;
            value+=1.0;
            return result;
        }
    }

}
package 生成器;

/**
 * Created by Panda on 2018/5/29.
 */
public class GeneratorTest {
    public static int size = 10;

    public static void test(Class<?> surroundingClass) {
        for (Class<?> type : surroundingClass.getClasses()) {
            System.out.println(type.getSimpleName() + ": ");
            try {
                Generator<?> generator = (Generator<?>) type.newInstance();
                for (int i = 0; i < size; i++) {
                    System.out.print(generator.next() + " ");
                }
                System.out.println();
            } catch (Exception e) {
                throw  new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        test(CountingGenerator.class);
    }
}

package 生成器;


/**
 * Created by Panda on 2018/5/29.
 */
public class Generated {
    public static <T> T[] array(T[] a,Generator<T> generator){
        return   new CollectionData<T>(generator,a.length).toArray(a);
    }

    public static <T> T[] array(Class<T> type,Generator<T> generator,int size){
        T[] a=(T[]) java.lang.reflect.Array.newInstance(type,size);
        return new CollectionData<T>(generator,size).toArray(a);
    }

}
package 生成器;

import java.util.Arrays;

/**
 * Created by Panda on 2018/5/29.
 */
public class TestGenerated {
    public static void main(String[] args) {
        Integer[] a={9,8,7,6};
        System.out.println(Arrays.toString(a));

        a=Generated.array(a,new CountingGenerator.Integer());
        System.out.println(Arrays.toString(a));

        Integer[] b=Generated.array(Integer.class,new CountingGenerator.Integer(),15);
        System.out.println(Arrays.toString(b));
    }
}
package 生成器;

import java.util.Random;

/**
 * Created by Panda on 2018/5/29.
 */
public class RandomGenerator {
    private static Random random = new Random(47);

    public static class Boolean implements Generator<java.lang.Boolean> {
        @Override
        public java.lang.Boolean next() {
            return random.nextBoolean();
        }
    }

    public static class Byte implements Generator<java.lang.Byte> {
        @Override
        public java.lang.Byte next() {
            return (byte) random.nextInt();
        }
    }

    public static class Character implements Generator<java.lang.Character> {
        @Override
        public java.lang.Character next() {
            return CountingGenerator.chars[random.nextInt(CountingGenerator.chars.length)];
        }
    }

    public static class String extends CountingGenerator.String {
        {
            characterGenerator = new Character();
        }

        public String() {
        }

        public String(int length) {
            super(length);
        }
    }

    public static class Short implements Generator<java.lang.Short> {
        @Override
        public java.lang.Short next() {
            return (short) random.nextInt();
        }
    }

    public static class Integer implements Generator<java.lang.Integer> {
        private int mod = 10000;

        public Integer() {
        }

        public Integer(int mod) {
            this.mod = mod;
        }

        @Override
        public java.lang.Integer next() {
            return random.nextInt(mod);
        }
    }


    public static class Long implements Generator<java.lang.Long> {
        private int mod = 10000;
        public Long() {}
        public Long(int mod) {this.mod = mod;}
        @Override
        public java.lang.Long next() {
            return new java.lang.Long(random.nextInt(mod));
        }
    }

    public static class Float implements Generator<java.lang.Float> {
        @Override
        public java.lang.Float next() {
            int trimmed = Math.round(random.nextFloat() * 100);
            return ((float) trimmed) / 100;
        }
    }

    public static class Double implements Generator<java.lang.Double> {
        @Override
        public java.lang.Double next() {
            long trimmed =Math.round(random.nextDouble()*100);
            return ((double)trimmed)/100;
        }
    }


}
package 生成器;


/**
 * Created by Panda on 2018/5/29.
 */
public class RandomGeneratorTest {
    public static void main(String[] args) {
        GeneratorTest.test(RandomGenerator.class);
    }
}
package 生成器;

import com.sun.org.apache.xpath.internal.operations.Bool;

/**
 * Created by Panda on 2018/5/29.
 */
//泛型不能用於基本類型。但是確實想用生成器填充基類類型數組,創建一個轉換器,
    //可以接收任意的包裝器對象數組,並將其轉換爲相應的基本類型數組。
public class ConverTo {
    public static boolean[] primitive(Boolean[] in){
        boolean[] result=new boolean[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static char[] primitive(Character[] in){
        char[] result=new char[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static byte[] primitive(Byte[] in){
        byte[] result=new byte[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static short[] primitive(Short[] in){
        short[] result=new short[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static int[] primitive(Integer[] in){
        int[] result=new int[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static long[] primitive(Long[] in){
        long[] result=new long[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static float[] primitive(Float[] in){
        float[] result=new float[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }

    public static double[] primitive(Double[] in){
        double[] result=new double[in.length];
        for (int i = 0; i <in.length ; i++) {
            result[i]=in[i];
        }
        return result;
    }
}
package 生成器;

import java.util.ArrayList;

/**
 * Created by Panda on 2018/5/29.
 */
//創建一個Collection對象,該對象中所填充的元素由2生成器gen產生,而元素的數量則有構造器的第二個參數確定
public class CollectionData<T> extends ArrayList<T> {
    public CollectionData(Generator<T> generator, int quality){
        for (int i = 0; i <quality ; i++) {
            add(generator.next());
        }
    }
    public static <T> CollectionData<T> list(Generator<T> generator, int quality){
        return new CollectionData<>(generator,quality);
    }
}
package 生成器;

/**
 * Created by Panda on 2018/5/17.
 */
//Map 生成器
public class Pair<K, V> {
    public final K key;
    public final V value;

    public Pair(K k, V v) {
        key = k;
        value = v;
    }
}
package 生成器;

import java.util.LinkedHashMap;

/**
 * Created by Panda on 2018/5/29.
 */
//Map適配器可以使用各種不同的Generator Iterator和常量值的組合來填充Map初始化對象
public class MapData<K,V> extends LinkedHashMap<K,V> {
    public MapData(Generator<Pair<K, V>> generator, int quantity) {
        for (int i = 0; i < quantity; i++) {
            Pair<K, V> pair = generator.next();
            put(pair.key, pair.value);
        }
    }


    public MapData(Generator<K> generatorK, Generator<V> generatorV, int quantity) {
        for (int i = 0; i < quantity; i++) {
            put(generatorK.next(), generatorV.next());
        }
    }

    public MapData(Generator<K> generatorK, V value, int quantity) {
        for (int i = 0; i < quantity; i++) {
            put(generatorK.next(), value);
        }
    }

    public MapData(Iterable<K> genK, Generator<V> genV) {
        for (K key : genK) {
            put(key, genV.next());
        }
    }

    public MapData(Iterable<K> genK, V value) {
        for (K key : genK) {
            put(key, value);
        }
    }

    public static <K, V> MapData<K, V> map(Generator<Pair<K, V>> generator, int quantity) {
        return new MapData<K, V>(generator, quantity);
    }

    public static <K, V> MapData<K, V> map(Generator<K> generatorK, Generator<V> generatorV, int quantity) {
        return new MapData<K, V>(generatorK, generatorV, quantity);
    }

    public static <K, V> MapData<K, V> map(Generator<K> generatorK, V value, int quantity) {
        return new MapData<K, V>(generatorK, value, quantity);
    }

    public static <K,V> MapData<K,V> map(Iterable<K> genK, Generator<V> genV){
        return new MapData<K, V>(genK,genV);
    }

    public static <K,V> MapData<K,V> map(Iterable<K> genK,V value){
        return new MapData<K, V>(genK,value);
    }
}
package 生成器;

import java.util.Arrays;

/**
 * Created by Panda on 2018/5/29.
 */
public class PrimitiveConversionDemonstration {
    public static void main(String[] args) {
        Integer[] a = Generated.array(Integer.class, new CountingGenerator.Integer(), 15);
        int[] b = ConverTo.primitive(a);
        System.out.println(Arrays.toString(b));

        boolean[] c=ConverTo.primitive(Generated.array(Boolean.class,new CountingGenerator.Boolean(),7));
        System.out.println(Arrays.toString(c));
    }
}
發佈了64 篇原創文章 · 獲贊 1 · 訪問量 6726
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章