首页 > 代码库 > Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象

Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象

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=http://www.mamicode.com/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}
*/