/**
* Created by Panda on 2018/5/29.
*///生成器:一種專門負責創建對象的類。工廠方法模式的一種應用
public interface Generator <T>{
T next();
}
/**
* Created by Panda on 2018/5/29.
*/publicclassGeneratorTest {publicstaticint size = 10;
publicstaticvoidtest(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) {
thrownew RuntimeException(e);
}
}
}
publicstaticvoidmain(String[] args) {
test(CountingGenerator.class);
}
}
package 生成器;
/**
* Created by Panda on 2018/5/29.
*///數據生成器publicclassCountingGenerator {//布爾類型publicstaticclassBooleanimplementsGenerator<java.lang.Boolean>{privateboolean value=false;
@Override
public java.lang.Boolean next() {
value=!value;
return value;
}
}
//Byte類型publicstaticclassByteimplementsGenerator<java.lang.Byte>{privatebyte value=0;
@Override
public java.lang.Byte next() {
return value++;
}
}
//字符類型staticchar[] chars=("abcdefghijklmnopqrstuvwxyz"+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
publicstaticclassCharacterimplementsGenerator<java.lang.Character>{intindex=-1;
@Override
public java.lang.Character next() {
index=(index+1)%chars.length;
return chars[index];
}
}
//字符串類型publicstaticclassStringimplementsGenerator<java.lang.String>{privateint 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=newchar[length];
for (int i = 0; i <length ; i++) {
buf[i]=characterGenerator.next();
}
returnnew java.lang.String(buf);
}
}
//short類型publicstaticclassShortimplementsGenerator<java.lang.Short>{privateshort value=0;
@Override
public java.lang.Short next() {
return value++;
}
}
//Integer 類型publicstaticclassIntegerimplementsGenerator<java.lang.Integer>{privateint value=0;
@Override
public java.lang.Integer next() {
return value++;
}
}
//long類型publicstaticclassLongimplementsGenerator<java.lang.Long>{privatelong value=0;
@Override
public java.lang.Long next() {
return value++;
}
}
//float類型publicstaticclassFloatimplementsGenerator<java.lang.Float>{private float value=0;
@Override
public java.lang.Float next() {
float result=value;
value+=1.0;
return result ;
}
}
//Double類型publicstaticclassDoubleimplementsGenerator<java.lang.Double>{privatedouble value=0;
@Override
public java.lang.Double next() {
double result=value;
value+=1.0;
return result;
}
}
}
package 生成器;
/**
* Created by Panda on 2018/5/29.
*/publicclassGeneratorTest {publicstaticint size = 10;
publicstaticvoidtest(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) {
thrownew RuntimeException(e);
}
}
}
publicstaticvoidmain(String[] args) {
test(CountingGenerator.class);
}
}
package 生成器;
/**
* Created by Panda on 2018/5/29.
*/publicclassGenerated {publicstatic <T> T[] array(T[] a,Generator<T> generator){
returnnew CollectionData<T>(generator,a.length).toArray(a);
}
publicstatic <T> T[] array(Class<T> type,Generator<T> generator,int size){
T[] a=(T[]) java.lang.reflect.Array.newInstance(type,size);
returnnew CollectionData<T>(generator,size).toArray(a);
}
}
package 生成器;
import java.util.Arrays;
/**
* Created by Panda on 2018/5/29.
*/publicclassTestGenerated {publicstaticvoidmain(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.
*/publicclassRandomGenerator {privatestatic Random random = new Random(47);
publicstaticclassBooleanimplementsGenerator<java.lang.Boolean> {
@Override
public java.lang.Boolean next() {
return random.nextBoolean();
}
}
publicstaticclassByteimplementsGenerator<java.lang.Byte> {
@Override
public java.lang.Byte next() {
return (byte) random.nextInt();
}
}
publicstaticclassCharacterimplementsGenerator<java.lang.Character> {
@Override
public java.lang.Character next() {
return CountingGenerator.chars[random.nextInt(CountingGenerator.chars.length)];
}
}
publicstaticclassStringextendsCountingGenerator.String {
{
characterGenerator = new Character();
}
public String() {
}
public String(int length) {
super(length);
}
}
publicstaticclassShortimplementsGenerator<java.lang.Short> {
@Override
public java.lang.Short next() {
return (short) random.nextInt();
}
}
publicstaticclassIntegerimplementsGenerator<java.lang.Integer> {privateintmod = 10000;
public Integer() {
}
public Integer(intmod) {
this.mod = mod;
}
@Override
public java.lang.Integer next() {
return random.nextInt(mod);
}
}
publicstaticclassLongimplementsGenerator<java.lang.Long> {privateintmod = 10000;
public Long() {}
public Long(intmod) {this.mod = mod;}
@Override
public java.lang.Long next() {
returnnew java.lang.Long(random.nextInt(mod));
}
}
publicstaticclassFloatimplementsGenerator<java.lang.Float> {
@Override
public java.lang.Float next() {
int trimmed = Math.round(random.nextFloat() * 100);
return ((float) trimmed) / 100;
}
}
publicstaticclassDoubleimplementsGenerator<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.
*/publicclassRandomGeneratorTest {publicstaticvoidmain(String[] args) {
GeneratorTest.test(RandomGenerator.class);
}
}
package 生成器;
import com.sun.org.apache.xpath.internal.operations.Bool;
/**
* Created by Panda on 2018/5/29.
*///泛型不能用於基本類型。但是確實想用生成器填充基類類型數組,創建一個轉換器,//可以接收任意的包裝器對象數組,並將其轉換爲相應的基本類型數組。publicclass ConverTo {
publicstatic boolean[] primitive(Boolean[] in){
boolean[] result=new boolean[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticchar[] primitive(Character[] in){
char[] result=newchar[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticbyte[] primitive(Byte[] in){
byte[] result=newbyte[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticshort[] primitive(Short[] in){
short[] result=newshort[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticint[] primitive(Integer[] in){
int[] result=newint[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticlong[] primitive(Long[] in){
long[] result=newlong[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticfloat[] primitive(Float[] in){
float[] result=newfloat[in.length];
for (int i = 0; i <in.length ; i++) {
result[i]=in[i];
}
return result;
}
publicstaticdouble[] primitive(Double[] in){
double[] result=newdouble[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 classCollectionData<T> extendsArrayList<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){
returnnew CollectionData<>(generator,quality);
}
}
package 生成器;
/**
* Created by Panda on 2018/5/17.
*///Map 生成器publicclass Pair<K, V> {
public final K key;
public final V value;
publicPair(K k, V v) {
key = k;
value = v;
}
}
package 生成器;
import java.util.LinkedHashMap;
/**
* Created by Panda on 2018/5/29.
*///Map適配器可以使用各種不同的Generator Iterator和常量值的組合來填充Map初始化對象publicclass MapData<K,V> extends LinkedHashMap<K,V> {
publicMapData(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);
}
}
publicMapData(Generator<K> generatorK, Generator<V> generatorV, int quantity) {
for (int i = 0; i < quantity; i++) {
put(generatorK.next(), generatorV.next());
}
}
publicMapData(Generator<K> generatorK, V value, int quantity) {
for (int i = 0; i < quantity; i++) {
put(generatorK.next(), value);
}
}
publicMapData(Iterable<K> genK, Generator<V> genV) {
for (K key : genK) {
put(key, genV.next());
}
}
publicMapData(Iterable<K> genK, V value) {
for (K key : genK) {
put(key, value);
}
}
publicstatic <K, V> MapData<K, V> map(Generator<Pair<K, V>> generator, int quantity) {
returnnew MapData<K, V>(generator, quantity);
}
publicstatic <K, V> MapData<K, V> map(Generator<K> generatorK, Generator<V> generatorV, int quantity) {
returnnew MapData<K, V>(generatorK, generatorV, quantity);
}
publicstatic <K, V> MapData<K, V> map(Generator<K> generatorK, V value, int quantity) {
returnnew MapData<K, V>(generatorK, value, quantity);
}
publicstatic <K,V> MapData<K,V> map(Iterable<K> genK, Generator<V> genV){
returnnew MapData<K, V>(genK,genV);
}
publicstatic <K,V> MapData<K,V> map(Iterable<K> genK,V value){
returnnew MapData<K, V>(genK,value);
}
}
package 生成器;
import java.util.Arrays;
/**
* Created by Panda on 2018/5/29.
*/publicclassPrimitiveConversionDemonstration {publicstaticvoidmain(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));
}
}