递归生成表格数据

前台缓存树节点中保存的是一组键值对,其中值是一个Map或直接就是String字符串。如果是Map的话还需要考虑Map中是否包装了List以及List中是否还会存在Map的情况。显然需要通过递归调用才能将这组数据结构全部遍历出来。

 

主方法中调用递归方法:

//调用递归方法
String table = displayMap(node.getData(),"1");
//取得展示数据返回前台
String sPage = "cache/showcache";
return new ModelAndView(sPage, "model", table);
 

//需要写两个方法,分别递归Map类型和List类型

public String displayMap(Map data,String borderStr) {
		StringBuffer sb = new StringBuffer();
		sb.append("<table cellpadding=\"0\" cellspacing=\"0\" border='"+borderStr+"'>");
	
		Iterator iter = data.entrySet().iterator();
		while (iter.hasNext()) {
			sb.append("<tr>");
			Entry e = (Entry) iter.next();
			String key = (String) e.getKey();
			sb.append("<td>");
			sb.append(key);
			sb.append("</td>");
			
			sb.append("<td>");
			Object value = e.getValue();
			if (value instanceof Map) {
				sb.append(displayMap((Map) value,"0"));
			} else if (value instanceof List) {
				sb.append(displayList((List) value));
			} else {
				sb.append(value);
			}
			sb.append("</td>");
			sb.append("</tr>");
		}
		sb.append("</table>");
		
		return sb.toString();
	}

	// 递归List类型
	public String displayList(List data) {
		StringBuffer sb = new StringBuffer();
		sb.append("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" frame=\"below\">");
		Iterator iter = data.iterator();
		while (iter.hasNext()) {
			sb.append("<tr>");
			sb.append("<td>");
			Object value = iter.next();
			if (value instanceof Map) {
				sb.append(displayMap((Map) value,"0"));
			} else if (value instanceof List) {
				sb.append(displayList((List) value));
			} else {
				sb.append(value);
			}
			sb.append("</td>");
			sb.append("</tr>");
		}
		sb.append("</table>");
		return sb.toString();
	}
 

Map常用keyset进行遍历,返回此映射中包含的键的Set视图。它的优点在于可以根据你所想要的key值得到你想要的values,更具灵活性。

 

代码示例:

public static void workByKeySet(Map<String, Student> map) {
        Set<String> key = map.keySet();
        for (Iterator it = key.iterator(); it.hasNext();) {
            String s = (String) it.next();
            System.out.println(map.get(s));
        }
    }
 

这里使用的另一种遍历Map的方法,通过entrySet取得此映射中包含映射关系的Set视图。

public static void workByEntry(Map<String, Student> map) {
        Set<Map.Entry<String, Student>> set = map.entrySet();
        for (Iterator<Map.Entry<String, Student>> it = set.iterator(); it.hasNext();) {
            Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
            System.out.println(entry.getKey() + "--->" + entry.getValue());
        }
    }
}
 

最后来看看API中对Map.Entry接口的解释:

映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值