161031、java.util.StringTokenizer使用及源码

import java.util.StringTokenizer;  
public class TestStringTokenizer {   
    public static void main(String[] args) {  
        String ivrdata="v1|v2|你好|哈哈";  
        getTokenizer1(ivrdata);  
        getTokenizer2(ivrdata);  
        getTokenizer2Array(ivrdata,"|");   
        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++;  
        }  
    }       
    /**以数组的形式获取*/
    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;  
    }
源码:
package java.util;
import java.lang.*;
public class StringTokenizer implements Enumeration<Object> {
    private int currentPosition;//当前位置
    private int newPosition;//新位置
    private int maxPosition;//最大位置
    private String str;//操作的字符串
    private String delimiters;//分隔符
    private boolean retDelims;
    private boolean delimsChanged;
    private int maxDelimCodePoint;
    private boolean hasSurrogates = false;
    private int[] delimiterCodePoints;
    private void setMaxDelimCodePoint() {
        if (delimiters == null) {
            maxDelimCodePoint = 0;
            return;
        }
        int m = 0;
        int c;
        int count = 0;
        for (int i = 0; i < delimiters.length(); i += Character.charCount(c)) {
            c = delimiters.charAt(i);
            if (c >= Character.MIN_HIGH_SURROGATE && c <= Character.MAX_LOW_SURROGATE) {
                c = delimiters.codePointAt(i);
                hasSurrogates = true;
            }
            if (m < c)
                m = c;
            count++;
        }
        maxDelimCodePoint = m;
        if (hasSurrogates) {
            delimiterCodePoints = new int[count];
            for (int i = 0, j = 0; i < count; i++, j += Character.charCount(c)) {
                c = delimiters.codePointAt(j);
                delimiterCodePoints[i] = c;
            }
        }
    }
    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 StringTokenizer(String str, String delim) {
        this(str, delim, false);
    }
    public StringTokenizer(String str) {
        this(str, " 	

f", false);
    }
    /**跳过分隔符*/
    private int skipDelimiters(int startPos) {
        if (delimiters == null)
            throw new NullPointerException();
        int position = startPos;
        while (!retDelims && position < maxPosition) {
            if (!hasSurrogates) {
                char c = str.charAt(position);
                if ((c > maxDelimCodePoint) || (delimiters.indexOf(c) < 0))
                    break;
                position++;
            } else {
                int c = str.codePointAt(position);
                if ((c > maxDelimCodePoint) || !isDelimiter(c)) {
                    break;
                }
                position += Character.charCount(c);
            }
        }
        return position;
    }
    /**从某个位置开始遍历token*/
    private int scanToken(int startPos) {
        int position = startPos;
        while (position < maxPosition) {
            if (!hasSurrogates) {
                char c = str.charAt(position);
                if ((c <= maxDelimCodePoint) && (delimiters.indexOf(c) >= 0))
                    break;
                position++;
            } else {
                int c = str.codePointAt(position);
                if ((c <= maxDelimCodePoint) && isDelimiter(c))
                    break;
                position += Character.charCount(c);
            }
        }
        if (retDelims && (startPos == position)) {
            if (!hasSurrogates) {
                char c = str.charAt(position);
                if ((c <= maxDelimCodePoint) && (delimiters.indexOf(c) >= 0))
                    position++;
            } else {
                int c = str.codePointAt(position);
                if ((c <= maxDelimCodePoint) && isDelimiter(c))
                    position += Character.charCount(c);
            }
        }
        return position;
    }
    /**判断该位置字符是否是分隔符*/
    private boolean isDelimiter(int codePoint) {
        for (int i = 0; i < delimiterCodePoints.length; i++) {
            if (delimiterCodePoints[i] == codePoint) {
                return true;
            }
        }
        return false;
    }
    /**是否还有token*/
    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);
    }
    /**下一个token*/
    public String nextToken(String delim) {
        delimiters = delim;
        delimsChanged = true;
        setMaxDelimCodePoint();
        return nextToken();
    }
    /**是否还有元素*/
    public boolean hasMoreElements() {
        return hasMoreTokens();
    }
    /**下一个元素*/
    public Object nextElement() {
        return nextToken();
    }
    /**计算Tokens的数量*/
    public int countTokens() {
        int count = 0;
        int currpos = currentPosition;
        while (currpos < maxPosition) {
            currpos = skipDelimiters(currpos);
            if (currpos >= maxPosition)
                break;
            currpos = scanToken(currpos);
            count++;
        }
        return count;
    }
}
原文地址:https://www.cnblogs.com/zrbfree/p/6023880.html