论坛首页 Java企业应用论坛

高效率分离字符串到一个Map中

浏览 7933 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-12-08   最后修改:2010-12-10
package test.hewen;

import java.io.UnsupportedEncodingException;
import java.util.Map;

public class StringUtil {
	/***
	 * 把一个字符串分离开,并按照key/value形式保存到Map中
	 * @param map 字符串中的字符存放在map中
	 * @param data 要分离的字符串
	 * @param encoding 字符编码
	 * @throws UnsupportedEncodingException
	 */
	public static void parseParameters(Map map, String data, String encoding)
			throws UnsupportedEncodingException {

		if ((data != null) && (data.length() > 0)) {//将字符串转换为字节数组
			byte[] bytes ;
			bytes=data.getBytes();
			parseParameters(map, bytes, encoding);
		}

	}

	/****
	 * 将字节数组中的字符分离到map中,该方法支持字符分离的标记:'%',
	 * '?','&'
	 * 
	 * @param map 存放分离的字符
	 * @param data  分离的字节数组
	 * @param encoding 按什么编码方法
	 * @throws UnsupportedEncodingException
	 */
	public static void parseParameters(Map map, byte[] data, String encoding)
			throws UnsupportedEncodingException {

		if (data != null && data.length > 0) {
			int ix = 0;
			int ox = 0;
			String key = null;
			String value = null;
			while (ix < data.length) {//对分离的字符数组循环
				byte c = data[ix++];
				switch ((char) c) {
				case '%':
				case '?':
				case '&'://当字节数组中的元素,遇到'%','?','&'字符,就创建value字符串
					value = new String(data, 0, ox, encoding);
					if (key != null) {
						putMapEntry(map, key, value);
						key = null;
					}
					ox = 0;
					break;
				case '='://当字节数组中的元素,遇到'='字符,那么创建key字符串
					key = new String(data, 0, ox, encoding);
					ox = 0;
					break;
				case '+'://当字节数组中的元素,遇到'+',那么就是以' '代替
					data[ox++] = (byte) ' ';
					break;
				default:
					data[ox++] = c;
				}
			}
			//最后一个截取的字符串,要进行处理
			if (key != null) {
				value = new String(data, 0, ox, encoding);
				putMapEntry(map, key, value);
			}
		}
	}
	
	/****
	 * 把分离的小字符串存放在map中
	 * 
	 * @param map
	 * @param name
	 * @param value
	 */
	private static void putMapEntry(Map map, String name, String value) {
		map.put(name, value);
	}

}

 

测试类:

 

package test.hewen;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/****
 * 这个是把一个字符串分离开,并按照key/value形式保存到Map中,
 * 分离的格式是以%,?,&其他就不支持了
 * 
 * @author Administrator
 *
 */

public class Test {

	public static void main(String[] args) throws UnsupportedEncodingException {
		String encoding = "ISO-8859-1";
		String queryString="userName=tar+zan%password=pw+d";
		Map.Entry entry;
		 Map results= new HashMap();
		StringUtil.parseParameters(results, queryString, encoding);
		Iterator it=results.entrySet().iterator();
		while(it.hasNext()){
			 entry=(Entry) it.next();
			 System.out.println("key="+entry.getKey()+" value="+entry.getValue());
		}
	}

	
}
   发表时间:2010-12-09  
           int len = data.length();  
           byte[] bytes = new byte[len];  
           bytes=data.getBytes();

这样的垃圾代码也叫高效吗?
0 请登录后投票
   发表时间:2010-12-09  
请你赐教一下怎样能达到高效,我这个高效自己自认的。。。如果有高效的代码,请你指点。。。
0 请登录后投票
   发表时间:2010-12-09   最后修改:2010-12-09
他只是觉得你的int len = data.length(); 
           byte[] bytes = new byte[len];  
是多余的而已... 你new 出来又不用.说明你copy也没到位.

其他的代码反正也是copy tomcat的源码 就不评价了.
0 请登录后投票
   发表时间:2010-12-09  
楼上是如何去查看特定的tomcat源码的呀?我也想学学,我是new come~~希望楼上的赐教哈~
0 请登录后投票
   发表时间:2010-12-09  
精华部分太多了,里面有很多设计思想和优秀的源码,要不断的调式跟踪源代码,推荐看看How Tomcat Works,最近我也在翻译这本书。。。
0 请登录后投票
   发表时间:2010-12-10  
为啥要传一个Map参数进去,而不是直接就返回一个Map对象呢?
0 请登录后投票
   发表时间:2010-12-10  
悠游键客 写道
为啥要传一个Map参数进去,而不是直接就返回一个Map对象呢?

楼主显然没看过《重构》,建议楼主去看下,这是一个不好的习惯
0 请登录后投票
   发表时间:2010-12-10  
悠游键客 写道
为啥要传一个Map参数进去,而不是直接就返回一个Map对象呢?


这个问题,难道也要问吗?

Map做为参数传递的好处应该很明显的……
0 请登录后投票
   发表时间:2010-12-10  
mp_juan 写道
这样的代码也能上首页,佩服了,jeye越来越不负责任



上首页访问的问题,没有审核,我想!


这个名字比较拉风而已,所以。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics