Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象
package org.rui.collection2.map;
/**
* map生成器
* @author lenovo
*
*/
public class Pair<K,V> {
public final K key;
public final V value;
public Pair(K k,V v)
{
this.key=k;
this.value=v;
}
}
//Generator.java
package org.rui.generics.anonymity;
public interface Generator<T> {
//返回泛型的内型对象
T next();
}
package org.rui.collection2.map;
import java.util.Iterator;
import java.util.LinkedHashMap;
import org.rui.generics.anonymity.Generator;
/**
* map 适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象
* @author lenovo
*
* @param <K>
* @param <V>
*/
public class MapData<K,V> extends LinkedHashMap<K,V>
{
public MapData(Generator<Pair<K,V>> gen,int quantity)
{
for(int i=0;i<quantity;i++)
{
Pair<K,V> p=gen.next();
put(p.key,p.value);
}
}
///
public MapData(Generator<K> genK,Generator<V> genV,int quantity)
{
for(int i=0;i<quantity;i++)
{
put(genK.next(),genV.next());
}
}
//A key Generator and a single value/
public MapData(Generator<K> genK,V genV,int quantity)
{
for(int i=0;i<quantity;i++)
{
put(genK.next(),genV);
}
}
///an iterable and a value generator
public MapData(Iterable<K> genK,Generator<V> genV)
{
for(K k : genK)
{
put(k,genV.next());
}
}
///an iterable and a single value
public MapData(Iterable<K> genK,V v)
{
for(K k : genK)
{
//System.out.println(k);
put(k,v);
}
}
/generic convenience methods///
public static<K,V> MapData<K,V> map(Generator<Pair<K,V>> gen,int quantity)
{
return new MapData<K,V>(gen,quantity);
}
public static<K,V> MapData<K,V> map(Generator<K> gen,Generator<V> genV,int quantity)
{
return new MapData<K,V>(gen,genV,quantity);
}
public static<K,V> MapData<K,V> map(Generator<K> gen,V v,int quantity)
{
return new MapData<K,V>(gen,v,quantity);
}
public static<K,V> MapData<K,V> map(Iterable<K> k,Generator<V> v)
{
return new MapData<K,V>(k,v);
}
public static<K,V> MapData<K,V> map(Iterable<K> k,V v)
{
return new MapData<K,V>(k,v);
}
}
package org.rui.collection2.map;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.rui.generics.anonymity.Generator;
/**
* 以下是一个使用MapData的演示样例,LettersGenerator
* 通过产生一个Iterator还实现了Iterable,通过这样的方式,
* 它能够被用来測试MapData.map()方法,而这些方法都须要用到iterable
* @author lenovo
*
*/
class Letters implements Generator<Pair<Integer,String>>,Iterable<Integer>
{
private int size=9;
private int number=1;
private char letter='a';
@Override
public Pair<Integer, String> next() {
return new Pair<Integer,String>(number++,""+letter++);
}
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>()
{
public Integer next() {return number++;}
public boolean hasNext(){return number<size;}
public void remove()
{
throw new UnsupportedOperationException();
}
};
}
}
public class MapDataTest {
public static void main(String[] args)
{
Character[] chars={'a','b','c','d','e'};
List<Character> list = Arrays.asList(chars);
System.out.println(MapData.map(new Letters(),11));
System.out.println(MapData.map(new Letters(),"pop"));
System.out.println(MapData.map(new Letters(),new Letters()));
System.out.println(MapData.map(list,"value"));
}
}
/**output:
{1=a, 2=b, 3=c, 4=d, 5=e, 6=f, 7=g, 8=h, 9=i, 10=j, 11=k}
{1=pop, 2=pop, 3=pop, 4=pop, 5=pop, 6=pop, 7=pop, 8=pop}
{1=org.rui.collection2.map.Pair@170bea5, 2=org.rui.collection2.map.Pair@f47396, 3=org.rui.collection2.map.Pair@d0af9b, 4=org.rui.collection2.map.Pair@b8f8eb, 5=org.rui.collection2.map.Pair@1de17f4, 6=org.rui.collection2.map.Pair@1f6ba0f, 7=org.rui.collection2.map.Pair@1313906, 8=org.rui.collection2.map.Pair@96cf11}
{a=value, b=value, c=value, d=value, e=value}
*/