Java之StringTokenizer的使用

1:作用和源码

作用是按照指定的分隔符对字符串进行分割,并提供API返回分割后的每个元素。
主要源码如下:

java.util.StringTokenizer
public class StringTokenizer implements Enumeration<Object> {
	public StringTokenizer(String str) {
        this(str, " \t\n\r\f", false);
    }
	public StringTokenizer(String str, String delim) {
        this(str, delim, false);
    }
    // str:要分割的字符串
    // delim:可能的分割字符,可指定多个,连着写即可
    // returnDelim:是否需要返回分割符
	public StringTokenizer(String str, String delim, boolean returnDelims) {
        currentPosition = 0;
        newPosition = -1;
        delimsChanged = false;
        this.str = str;
        maxPosition = str.length();
        delimiters = delim;
        retDelims = returnDelims;
        setMaxDelimCodePoint();
    }
    // 是否还有下一个元素
	public boolean hasMoreTokens() {
	        newPosition = skipDelimiters(currentPosition);
	        return (newPosition < maxPosition);
	    }
	}

	// 返回下一个元素
	public String nextToken() {
        currentPosition = (newPosition >= 0 && !delimsChanged) ?
            newPosition : skipDelimiters(currentPosition);
        delimsChanged = false;
        newPosition = -1;

        if (currentPosition >= maxPosition)
            throw new NoSuchElementException();
        int start = currentPosition;
        currentPosition = scanToken(currentPosition);
        return str.substring(start, currentPosition);
    }

2:实例

如有字符串{name=jack, age=90},要解析出姓名和年龄,代码如下:

public static void main(String[] args) throws Exception {
    Stringmystr = "{name=jack, age=90}";
    // 使用{ } = ,作为分隔符进行分割,并且不返回分割符,当然如果有特殊需求也可以选择返回
    StringTokenizer stringTokenizer = new StringTokenizer(mystr, "{}=, ", false);
    while (stringTokenizer.hasMoreTokens()) {
        String key = stringTokenizer.nextToken();
        String value = stringTokenizer.nextToken();
        System.out.println("key: " + key);
        System.out.println("value: " + value);
    }
}

运行:

key: name
value: jack
key: age
value: 90

Process finished with exit code 0

简单修改程序,看下返回分割符的情况,修改代码如下:

public static void main(String[] args) throws Exception {
    String mystr = "{name=jack, age=90}";
    // 使用{ } = ,作为分隔符进行分割,并且不返回分割符,当然如果有特殊需求也可以选择返回
    StringTokenizer stringTokenizer = new StringTokenizer(mystr, "{}=, ", true);
    while (stringTokenizer.hasMoreTokens()) {
        // 注意:前后拼接-的原因是看出空格的效果
        System.out.println("-" + stringTokenizer.nextToken() + "-");
    }
}

输出:

-{-
-name-
-=-
-jack-
-,-
- -
-age-
-=-
-90-
-}-

Process finished with exit code 0
package lsy; import java.util.StringTokenizer; /** * * @author lushuaiyin * */ public class StringTokenizerTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String ivrdata="v1|v2|你好|哈哈"; getTokenizer1(ivrdata); System.out.println("----------------------------------"); getTokenizer2(ivrdata); System.out.println("----------------------------------"); getTokenizer2Array(ivrdata,"|"); System.out.println("----------------------------------"); String ssss="y1 y2 split实现 哈哈"; String[] strarr=getTokenizer2Array(ssss,""); } public static void getTokenizer1(String str){ StringTokenizer st = new StringTokenizer(str, "|",true); System.out.println("countTokens:"+st.countTokens()); int j=0; while(st.hasMoreTokens()){ System.out.println(j+":"+st.nextToken()); j++; } } public static void getTokenizer2(String str){ StringTokenizer st = new StringTokenizer(str, "|",false); System.out.println("countTokens:"+st.countTokens()); int j=0; while(st.hasMoreTokens()){ System.out.println(j+":"+st.nextToken()); j++; } } //////////////split实现////////// public static String[] getTokenizer2Array(String str,String splitStr){ String[] arr=null; if(str==null||str.trim().equals("")){ }else{ if(splitStr==null||splitStr.trim().equals("")){ splitStr=" "; } StringTokenizer st = new StringTokenizer(str, splitStr,false); System.out.println("ArraySize:"+st.countTokens()); arr=new String[st.countTokens()]; int j=0; while(st.hasMoreTokens()){ String temp=st.nextToken(); System.out.println(j+":"+temp); arr[j]=temp; j++; } } return arr; } /*api解释 public StringTokenizer(String str, String delim, boolean returnDelims) str是要处理的字符串; delim是分隔符; returnDelims 是否把分隔符也作为结果返回 (public StringTokenizer(String str, String delim) returnDelims默认false; StringTokenizer(String str)默认分隔符delim是 " \t\n\r\f",returnDelims是false) 遍历的api中注意,hasMoreElements()等于hasMoreTokens(); nextElement()等于nextToken()。可以 看源码验证。 打印: countTokens:7 0:v1 1:| 2:v2 3:| 4:你好 5:| 6:哈哈 ---------------------------------- countTokens:4 0:v1 1:v2 2:你好 3:哈哈 ---------------------------------- ArraySize:4 0:v1 1:v2 2:你好 3:哈哈 ---------------------------------- ArraySize:4 0:y1 1:y2 2:split实现 3:哈哈 */ }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值