package org.opencron.common.utils;
import java.util.*;
/**
* @Package: cn.damai.usercenter.common.util
* @Description: 专门封装参数的Map,HashMap的增强
* @author: Wanghuajie
* @date: 13-3-6 - 上午11:17
* @version: V1.0
* @company: damai
*/
@SuppressWarnings({"serial","rawtypes", "unchecked"})
public class ParamsMap<K,V> extends HashMap<K,V> implements Map<K,V> {
private Map<K,V> map = new HashMap<K,V>(0);
public static ParamsMap instance(){
return new ParamsMap();
}
public ParamsMap(Object...objects){
this.put(objects);
}
public ParamsMap put(Object...objects){
if (objects==null) return this;
List<Object> argsSkipMap = new ArrayList<Object>(0);
int argsCount = 0;
for (int i=0;i<objects.length;i++) {
if (objects[i] instanceof Map) {
if ((argsCount&1) == 1) {
throw new IllegalArgumentException("arguments error,index of " +i+1+ " key can't be Map");
}
this.put((Map)objects[i]);
} else {
argsSkipMap.add(objects[i]);
++argsCount;
}
}
//不是成对的参数
if ((argsSkipMap.size()&1)==1){
throw new RuntimeException("arguments error.. The number of arguments to remove the Map type arguments must be an even number!");
}
for (int j=0;j<argsSkipMap.size()/2;j++){
K k = (K)argsSkipMap.get(j * 2);
V v = (V)argsSkipMap.get(j * 2 + 1);
this.map.put(k,v);
}
return this;
}
public ParamsMap put(Map<K,V> argsMap){
for(Map.Entry entry:argsMap.entrySet()){
this.put(entry.getKey(),entry.getValue());
}
return this;
}
public ParamsMap remove(int index){
int tempIndex = 1;
for (Map.Entry entry : map.entrySet()) {
if (tempIndex == index) {
this.remove(entry.getKey());
break;
}
++tempIndex;
}
return this;
}
@Override
public int size() {
return this.map.size();
}
public boolean isEmpty(){
return this.map==null||this.map.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return this.map.containsKey(key);
}
public boolean notEmpty(){
return !this.isEmpty();
}
public ParamsMap putBefore(K key, V val,int insertIndex,Comparator<K> comparator) {
//1,2,3
if (insertIndex<=0||insertIndex>this.map.size()){
throw new IndexOutOfBoundsException();
}
Set<K> keySet = new TreeSet(comparator);
keySet.addAll(this.map.keySet());
Map<K,V> tempMap = new HashMap<K,V>();
int tempIndex = 0;
for (K k: keySet) {
if (tempIndex == insertIndex-1) {
tempMap.put(key, val);
}
tempMap.put(k,map.get(k));
++tempIndex;
}
map = tempMap;
return this;
}
public ParamsMap putAfter(K key, V val,int insertIndex,Comparator<K> comparator){
if (insertIndex<=0||insertIndex>this.map.size()){
throw new IndexOutOfBoundsException();
}
Set<K> keySet = new TreeSet(comparator);
keySet.addAll(this.map.keySet());
Map<K,V> tempMap = new HashMap<K,V>();
int tempIndex = 1;
for (K k: keySet) {
if (tempIndex == insertIndex) {
tempMap.put(key, val);
}
tempMap.put(k, map.get(k));
++tempIndex;
}
map = tempMap;
return this;
}
public ParamsMap putBefore(Map<K,V> tarMap,int insertIndex,Comparator<K> comparator){
if (insertIndex<=0||insertIndex>this.map.size()){
throw new IndexOutOfBoundsException();
}
Set<K> keySet = new TreeSet(comparator);
keySet.addAll(this.map.keySet());
Map<K,V> tempMap = new HashMap<K,V>();
int tempIndex = 0;
for (K k: keySet) {
if (tempIndex == insertIndex-1) {
for (Map.Entry<K,V> tarEntry : tarMap.entrySet()) {
tempMap.put(tarEntry.getKey(),tarEntry.getValue());
}
}
tempMap.put(k, map.get(k));
++tempIndex;
}
map = tempMap;
return this;
}
public ParamsMap putAfter(Map<K,V> tarMap,int insertIndex,Comparator<K> comparator){
if (insertIndex<=0||insertIndex>this.map.size()){
throw new IndexOutOfBoundsException();
}
Map<K,V> tempMap = new HashMap<K,V>();
int tempIndex = 1;
Set<K> keySet = new TreeSet(comparator);
keySet.addAll(this.map.keySet());
for (K k: keySet) {
if (tempIndex == insertIndex) {
for (Map.Entry<K,V> tarEntry : tarMap.entrySet()) {
tempMap.put(tarEntry.getKey(),tarEntry.getValue());
}
}
tempMap.put(k, map.get(k));
++tempIndex;
}
map = tempMap;
return this;
}
@Override
public Set<Map.Entry<K,V>> entrySet() {
return this.map.entrySet();
}
@Override
public Collection values() {
return this.map.values();
}
@Override
public Set keySet() {
return this.map.keySet();
}
@Override
public boolean containsValue(Object value) {
return this.map.containsValue(value);
}
@Override
public V get(Object key) {
return this.map.get(key);
}
@Override
public V put(K key, V value) {
return this.map.put(key,value);
}
@Override
public void clear() {
this.map.clear();
}
@Override
public V remove(Object key) {
return this.map.remove(key);
}
@Override
public void putAll(Map m) {
this.map.putAll(m);
}
public ParamsMap fill(K key,V val){
map.put(key,val);
return this;
}
public Map<K, V> getMap() {
return map;
}
public static void main(String[] args){
ParamsMap paramsMap = new ParamsMap();
ParamsMap<Integer,Object> map = paramsMap.put("A","B","2","d",4,"55",new Date(),"ff");
map.fill(1,"ddd").fill("2","fdafds").fill(444,666);
for(Map.Entry<Integer,Object> entry:map.entrySet()){
System.out.println(entry.getKey()+"_____"+entry.getValue()+"____"+entry.getValue().getClass());
}
}
}