package org.nutz.lang.util;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.nutz.castor.Castors;
import org.nutz.lang.Lang;

@SuppressWarnings("serial")
public class NutMap extends TreeMap<String, Object> {

	public NutMap() {
		super();
	}

	public NutMap(Map<String, Object> map) {
		super();
		this.putAll(map);
	}

	public NutMap(String json) {
		super();
		this.putAll(Lang.map(json));
	}

	public int getInt(String key) {
		return getAs(int.class, key, -1);
	}

	public int getInt(String key, int dft) {
		return getAs(int.class, key, dft);
	}

	public String getString(String key) {
		return getAs(String.class, key, null);
	}

	public String getString(String key, String dft) {
		return getAs(String.class, key, dft);
	}

	public <T> List<T> getList(Class<T> eleType, String key) {
		Object obj = this.get(key);
		if (obj == null)
			return null;
		if (obj instanceof List<?>)
			return Lang.collection2list((List<?>) obj, eleType);
		if (obj.getClass().isArray())
			return Lang.array2list(obj, eleType);
		if (obj instanceof Map<?, ?>)
			return Lang.collection2list(((Map<?, ?>) obj).values(), eleType);
		List<T> list = new ArrayList<T>(1);
		list.add(Castors.me().castTo(obj, eleType));
		return list;
	}

	public <T> T getAs(Class<T> toType, String key) {
		return getAs(toType, key, null);
	}

	public <T> T getAs(Class<T> toType, String key, T dft) {
		Object obj = get(key);
		if (null == obj)
			return dft;
		return Castors.me().castTo(obj, toType);
	}

	/**
	 * 为 Map 增加一个名值对。
	 * <ul>
	 * <li>如果该键不存在，则添加对象。
	 * <li>如果存在并且是 List，则添加到 List。
	 * <li>创建一个 List ，并添加对象
	 * </ul>
	 * 
	 * @param key
	 * @param value
	 */
	@SuppressWarnings("unchecked")
	public NutMap add(String key, Object value) {
		Object obj = get(key);
		if (null == obj)
			put(key, value);
		else if (obj instanceof List<?>)
			((List<Object>) obj).add(value);
		else {
			List<Object> list = new LinkedList<Object>();
			list.add(obj);
			list.add(value);
			put(key, list);
		}
		return this;
	}
}

@@ -222,16 +222,153 @@
 ang;%0D%0A%0D%0A
+/**%0D%0A * %E5%AF%B9%E4%BA%8E TreeMap %E7%9A%84%E4%B8%80%E4%B8%AA%E5%8F%8B%E5%A5%BD%E5%B0%81%E8%A3%85%0D%0A * %3Cp%3E%0D%0A * %E5%90%8C TreeMap %E4%B8%8D%E5%90%8C%E7%9A%84%E6%98%AF%EF%BC%8C%E5%A6%82%E6%9E%9C get(null)%EF%BC%8C%E5%AE%83%E4%B8%8D%E4%BC%9A%E6%8A%9B%E9%94%99%EF%BC%8C%E5%B0%B1%E6%98%AF%E8%BF%94%E5%9B%9E null %E6%88%96%E9%BB%98%E8%AE%A4%E5%80%BC%0D%0A * %0D%0A * @author zozoh(zozohtnt@gmail.com)%0D%0A */%0D%0A
 @Suppres
@@ -1650,24 +1650,60 @@
 , T dft) %7B%0D%0A
+%09%09if (null == key)%0D%0A%09%09%09return dft;%0D%0A
 %09%09Object obj

修改了一下 NutMap 的一个小 Bug