java.util.StringTokenizer源码学习记录

StringTokenizer stringTokenizer = new StringTokenizer("1aksdhka111as23sda", "as");
while (stringTokenizer.hasMoreTokens()) {
    System.out.println(stringTokenizer.nextToken());
}
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();
}
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);
        // 判断字符是不是highSurrogate   就是占两个字符的一个文字
        if (c >= Character.MIN_HIGH_SURROGATE && c <= Character.MAX_LOW_SURROGATE) {
            c = delimiters.codePointAt(i);
            hasSurrogates = true; // 表示分隔符中含有Surrogate的文字  在判断是否含有分隔符时使用
        }
        if (m < c) // 分隔符delimiters中数字最大的codePoint
            m = c;
        count++;
    }
    maxDelimCodePoint = m;

    if (hasSurrogates) {
        delimiterCodePoints = new int[count]; // 保存分隔符的codePoint数组
        for (int i = 0, j = 0; i < count; i++, j += Character.charCount(c)) {
            c = delimiters.codePointAt(j);
            delimiterCodePoints[i] = c;
        }
    }
}
public boolean hasMoreTokens() {
    newPosition = skipDelimiters(currentPosition);
    return (newPosition < maxPosition);
}
private int skipDelimiters(int startPos) {
    if (delimiters == null)
        throw new NullPointerException();

    int position = startPos;
    // 这个循环的作用就是将当前指针移动到非分隔符文字的位置上
    while (!retDelims && position < maxPosition) {
        if (!hasSurrogates) { // 根据分隔符是否含有Surrogates文字 进行作用一样的不同判断
            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;
}
public String nextToken() {
    
    // 这一步是为String nextToken(String delim)方法服务的  分隔过程中改变分隔符
    currentPosition = (newPosition >= 0 && !delimsChanged) ?
        newPosition : skipDelimiters(currentPosition);

    /* Reset these anyway */
    delimsChanged = false;
    newPosition = -1;

    if (currentPosition >= maxPosition)
        throw new NoSuchElementException();
    int start = currentPosition;
    currentPosition = scanToken(currentPosition);
    return str.substring(start, currentPosition);
}
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);
        }
    }
    // startPos==position就是startPos指向的就是分隔符 
    // 那么这次scanToken就是扫描出分隔符开始和结束位置  说明分隔符可以是多个字符组成
    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;
}

 

转载于:https://my.oschina.net/zhuqianli/blog/1606121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值