最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java StringTokenizer分隔符拆分字符串

 更新時間:2023年08月01日 09:27:13   作者:韓長奇  
Java中的StringTokenizer類用于將一個字符串分解成標記,本文主要介紹了Java StringTokenizer分隔符拆分字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

StringTokenizer的成員變量

// 以下七個參數(shù)是在三個參數(shù)的構造方法中設置的
// 當前位置
private int currentPosition;
// 下一個要處理的字符的索引
private int newPosition;
// 最大位置,即被分割字符串的長度
private int maxPosition;
// 要分割的字符串
private String str;
// 分隔符,字符串中的每個字符都是一個分隔符
private String delimiters;
// 指示是否將分隔符作為令牌返回的標志。
private boolean retDelims;
// 分隔符是否改變的表示,true表示分隔符發(fā)生改變,false表示分隔符沒發(fā)生改變,默認為false
private boolean delimsChanged;
// 以下三個參數(shù)是在構造方法的setMaxDelimCodePoint()方法中設置
// 保存分隔符中ASCII碼值最大的的字符
private int maxDelimCodePoint;
// 是否包含代理,即是否涉及到UTF-16和Unicode編碼,一般不會涉及到。
private boolean hasSurrogates = false;
// 如果涉及到代理(即涉及到UTF-16和Unicode編碼),會將所有的分隔符轉換成碼點值保存到int數(shù)組中
private int[] delimiterCodePoints;

StringTokenizer 的構造方法

1、StringTokenizer(String str)只有一個入?yún)⒌臉嬙旌瘮?shù)。

// 單個參數(shù)的構造函數(shù),參數(shù)為需要被解析的字符串
public StringTokenizer(String str) {
    // 調(diào)用三個參數(shù)的構造方法:
    // 1、需要被解析的字符串;
    // 2、Java默認的分隔符,包括空格、制表符、換行符、回車符、\f;
    // 3、指示是否將分隔符作為令牌返回的標志。false表示分隔符本身不會被視為令牌
    this(str, " \t\n\r\f", false);
}

2、StringTokenizer(String str, String delim)兩個入?yún)⒌臉嬙旌瘮?shù)

// 兩個參數(shù)的構造方法,str:需要被解析的字符串  delim:分隔符字符串,每一個字符都是一個分隔符
public StringTokenizer(String str, String delim) {
    // 1、需要被解析的字符串;
    // 2、使用指定的字符作為分割符
    // 3、指示是否將分隔符作為令牌返回的標志。false表示分隔符本身不會被視為令牌
    this(str, delim, false);
}

3、StringTokenizer(String str, String delim, boolean returnDelims)三個入?yún)⒌臉嬙旌瘮?shù)

public StringTokenizer(String str, String delim, boolean returnDelims) {
    // 當前位置設為0,即索引下標為0
    currentPosition = 0;
    // 下個要處理的位置
    newPosition = -1;
    // 分隔符是否改變的表示,true表示分隔符發(fā)生改變,false表示分隔符沒發(fā)生改變,默認為false
    delimsChanged = false;
    // 要分割的字符串
    this.str = str;
    // 最大位置,即被分割字符串的長度
    maxPosition = str.length();
    // 設置分隔符,字符串中的每個字符都是一個分隔符
    delimiters = delim;
    // 指示是否將分隔符作為令牌返回的標志。
    retDelims = returnDelims;
    // 設置分割符中ASCII碼值最大字符
    setMaxDelimCodePoint();
}

StringTokenizer public修飾的方法

hasMoreTokens() 判斷是否被分割字符串中是否有更多可用的標記

注意:該方法為public修飾的方法。
1、返回true,表示后續(xù)調(diào)用nextToken()將成功返回一個token(即分割好的字符串)。
2、返回false,表示后續(xù)調(diào)用nextToken()將會拋出異常:NoSuchElementException

// 如果retDelims為false(不將分隔符作為令牌返回的標志),判斷當前位置及當前位置之后是否還有非分隔符的字符
// 如果retDelims為true(將分隔符作為令牌返回的標志),判斷當前位置是否小于被分割字符串的長度
public boolean hasMoreTokens() {
    /*
     * Temporarily store this position and use it in the following
     * nextToken() method only if the delimiters haven't been changed in
     * that nextToken() invocation.
     *
     * 臨時存儲此位置,并僅在nextToken()調(diào)用中分隔符未更改時在以下nextToken()方法中使用它。
     */
    // 如果retDelims為false(不將分隔符作為令牌返回的標志),則返回當前位置或當前位置之后第一個非分隔符的字符索引
    // 如果retDelims為true(將分隔符作為令牌返回的標志),返回當前位置字符的索引
    newPosition = skipDelimiters(currentPosition);
    // 當前位置小于被分割字符串的長度
    return (newPosition < maxPosition);
}

nextToken()獲取下一個根據(jù)分隔符拆分的字符串

注意:該方法為public關鍵字修飾的方法

// 獲取下一個根據(jù)分隔符拆分的字符串
public String nextToken() {
? ? /*
? ? ?* If next position already computed in hasMoreElements() and
? ? ?* delimiters have changed between the computation and this invocation,
? ? ?* then use the computed value.
? ? ?* 如果下一個位置已經(jīng)在hasMoreElements()中計算過,并且分隔符在計算和調(diào)用之間發(fā)生了變化,則使用計算值。
? ? ?*/
? ? // 當下一個要處理的字符索引 >= 0 并且 分隔符未發(fā)生改變時,將下一個要處理的字符索引 賦值給 當前位置(當前要處理的字符索引)
? ? // 否則重新計算下一個要處理的字符索引
? ? currentPosition = (newPosition >= 0 && !delimsChanged) ?
? ? ? ? newPosition : skipDelimiters(currentPosition);
? ? /* Reset these anyway */
? ? // 將分隔符是否改變的標志設置為false,表示分隔符不再變化
? ? delimsChanged = false;
? ? // 重新將下一個要處理的字符索引設置為-1
? ? newPosition = -1;
? ? // 如果當前位置 >= 最大位置,拋出異常
? ? if (currentPosition >= maxPosition)
? ? ? ? throw new NoSuchElementException();
? ? // 將當前位置設置為截取字符串的開始下標
? ? int start = currentPosition;
? ? // 獲取下一個分隔符的索引。并且currentPosition(當前位置)變?yōu)榉指舴谖恢玫乃饕?
? ? currentPosition = scanToken(currentPosition);
? ? // 截取字符串,從第一個非分隔符的索引開始,到下一個分隔符的索引結束。
? ? return str.substring(start, currentPosition);
}

nextToken(String delim)根據(jù)新的分隔符獲取下一個被拆分出來的字符串

注意:該方法為public修飾的方法

// 根據(jù)新的分隔符獲取下一個被拆分出來的字符串
public String nextToken(String delim) {
? ? // 設置分隔符,字符串中的每個字符都是一個分隔符
? ? delimiters = delim;
? ? /* delimiter string specified, so set the appropriate flag.
? ? * 創(chuàng)建對象后重新設置分隔符字符串,需要將此標志設置為true。 */
? ? delimsChanged = true;
? ? // 需改分隔符字符串后需要重新設置設置maxDelimCodePoint(分隔符中的最高字符,即ASCII碼值最大的的字符)
? ? setMaxDelimCodePoint();
? ? // ?根據(jù)分隔符獲取下一個拆分出來的字符串
? ? return nextToken();
}

countTokens()獲取被分割的字符串中還能拆分出幾個字符串。

注意:該方法為public修飾的方法,隨這nextToken()方法的調(diào)用,該方法返回值會發(fā)生變化。

// 獲取被分割的字符串中還能拆分出幾個字符串。隨這nextToken()方法的調(diào)用,該方法返回值會發(fā)生變化
public int countTokens() {
    int count = 0;
    // currentPosition為成員變量,所以會隨著其他方法的調(diào)用發(fā)生變化,因此該方法的返回值會發(fā)生變化
    int currpos = currentPosition;
    // 當前位置字符 < 被分割字符串長度
    while (currpos < maxPosition) {
        // 獲取當前位置或當前位置之后第一個非分隔符的字符索引
        currpos = skipDelimiters(currpos);
        // 如果 當前位置 >= 被分割字符串長度 則跳出循環(huán)
        if (currpos >= maxPosition)
            break;
        // 獲取下一個分隔符的索引
        currpos = scanToken(currpos);
        count++;
    }
    return count;
}

StringTokenizer private修飾的方法

setMaxDelimCodePoint()設置分隔符中的最高字符,即ASCII碼值最大的的字符。

注意:該方法為private修飾的方法。

// 設置maxDelimCodePoint的值為分隔符中的最高字符,即ASCII碼值最大的的字符。
private void setMaxDelimCodePoint() {
? ? // 如果分隔符為null,
? ? if (delimiters == null) {
? ? ? ? maxDelimCodePoint = 0;
? ? ? ? return;
? ? }
? ? int m = 0;
? ? int c;
? ? int count = 0;
? ? // Character.charCount(c) 如果c大于等于 Unicode最小補充碼點 返回2,否則返回1
? ? for (int i = 0; i < delimiters.length(); i += Character.charCount(c)) {
? ? ? ? // delimiters分隔符字符串中下標為i的字符,使用int接收,返回的是ASCII值
? ? ? ? c = delimiters.charAt(i);
? ? ? ? // 如果 c >= Unicode編碼的最小高代理 并且 c <= Unicode編碼的最大低代理。與UTF-16相關。
? ? ? ? if (c >= Character.MIN_HIGH_SURROGATE && c <= Character.MAX_LOW_SURROGATE) {
? ? ? ? ? ? // 獲取分隔符字符串 下標為i處的字符的Unicode碼點值
? ? ? ? ? ? c = delimiters.codePointAt(i);
? ? ? ? ? ? // 將是否使用代理設置為true
? ? ? ? ? ? hasSurrogates = true;
? ? ? ? }
? ? ? ? // 比較每個分隔符的ASCII值,將最大ASCII值賦值給m
? ? ? ? if (m < c)
? ? ? ? ? ? m = c;
? ? ? ? // count表示
? ? ? ? count++;
? ? }
? ? // 將最大ASCII值賦值給maxDelimCodePoint
? ? maxDelimCodePoint = m;
? ? // 如果有代理
? ? if (hasSurrogates) {
? ? ? ? // 如果涉及到UTF-16和Unicode編碼,將所有分隔符轉換成 Unicode碼點值
? ? ? ? delimiterCodePoints = new int[count];
? ? ? ? for (int i = 0, j = 0; i < count; i++, j += Character.charCount(c)) {
? ? ? ? ? ? c = delimiters.codePointAt(j);
? ? ? ? ? ? delimiterCodePoints[i] = c;
? ? ? ? }
? ? }
}

skipDelimiters()獲取下一個要處理字符的索引

注意:該方法為private修飾的方法

// 如果retDelims為false(不將分隔符作為令牌返回的標志),則返回當前位置或當前位置之后第一個非分隔符的字符索引
// 如果retDelims為true(將分隔符作為令牌返回的標志),返回當前位置字符的索引
private int skipDelimiters(int startPos) {
? ? // 分隔符字符串非空校驗
? ? if (delimiters == null)
? ? ? ? throw new NullPointerException();
? ? // 記錄字符串下標位置,即當前判斷的位置
? ? int position = startPos;
? ? // retDelims 一般設置為false,表示不將分隔符作為令牌返回的標志。
? ? while (!retDelims && position < maxPosition) {
? ? ? ? // hasSurrogates默認為false,表示沒有代理,即不涉及UTF-16和Unicode編碼
? ? ? ? if (!hasSurrogates) {
? ? ? ? ? ? // 從被分割字符串str中獲取當前位置的字符
? ? ? ? ? ? char c = str.charAt(position);
? ? ? ? ? ? // 如果 當前位置的字符 大于 分隔符中的最大字符 或者 分隔符字符串中沒有當前字符
? ? ? ? ? ? if ((c > maxDelimCodePoint) || (delimiters.indexOf(c) < 0))
? ? ? ? ? ? ? ? // 跳出循環(huán)
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? // 當前位置 +1
? ? ? ? ? ? position++;
? ? ? ? } else {
? ? ? ? ? ? // 存在代理(涉及UTF-16和Unicode編碼),獲取當前位置字符的Unicode碼點值
? ? ? ? ? ? int c = str.codePointAt(position);
? ? ? ? ? ? // 如果當前位置的字符碼點值大于分隔符中的最大字符 或者 當前碼點至對應的字符不是分隔符
? ? ? ? ? ? if ((c > maxDelimCodePoint) || !isDelimiter(c)) {
? ? ? ? ? ? ? ? // 跳出本次循環(huán)
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? // 如果c大于等于 Unicode最小補充碼點 當前位置+2,否則,當前位置+1
? ? ? ? ? ? position += Character.charCount(c);
? ? ? ? }
? ? }
? ? return position;
}

isDelimiter()判斷碼點值對應的字符是不是分隔符

注意:該方法為private修飾的方法

// 判斷碼點值對應的字符是不是分隔符,返回true表示當前碼點值是一個分隔符,返回false表示當前的碼點值不是分隔符的碼點值
private boolean isDelimiter(int codePoint) {
    // 涉及到代理(即涉及到UTF-16和Unicode編碼),從分隔符成碼點值數(shù)組中遍歷
    for (int delimiterCodePoint : delimiterCodePoints) {
        // 如果分隔符成碼點值數(shù)組中的某一個值等于當前碼點值
        if (delimiterCodePoint == codePoint) {
            // 返回true
            return true;
        }
    }
    // 返回false
    return false;
}

scanToken(int startPos)獲取下一個分隔符的索引

注意:該方法為private修飾的方法

// 從startPos跳過并返回遇到的下一個分隔符字符的索引,如果沒有找到這樣的分隔符,則返回maxPosition。
private int scanToken(int startPos) {
    int position = startPos;
    // 當要操作的字符索引小于被分割字符串的長度
    while (position < maxPosition) {
        // 當不包含代理,即不涉及到UTF-16和Unicode編碼。
        if (!hasSurrogates) {
            // 獲取當前索引位置的字符
            char c = str.charAt(position);
            // 當前字符 <= 分隔符最大字符 并且 當前字符是一個分隔符。找到分隔符時推出
            if ((c <= maxDelimCodePoint) && (delimiters.indexOf(c) >= 0))
                // 退出循環(huán)
                break;
            // 當前索引位置+1
            position++;
        } else {
            // 獲取當前索引位置對應的字符的Unicode碼值
            int c = str.codePointAt(position);
            // 當前字符 <= 分隔符最大字符 并且 當前字符是一個分隔符。找到分隔符時推出
            if ((c <= maxDelimCodePoint) && isDelimiter(c))
                break;
            // 涉及到Unicode編碼,需要判斷當前字符是占一個位置還是兩個位置
            position += Character.charCount(c);
        }
    }
    // 需要將分隔符作為令牌返回的標志,并且 當前位置與起始位置一直
    if (retDelims && (startPos == position)) {
        // 當不包含代理,即不涉及到UTF-16和Unicode編碼。
        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))
                // // 涉及到Unicode編碼,需要判斷當前字符是占一個位置還是兩個位置
                position += Character.charCount(c);
        }
    }
    // 返回分隔符的索引值
    return position;
}

StringTokenizer 類的使用

1、可以使用以下方式創(chuàng)建一個spring容器

public static void main(String[] args) {
    ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext();
    // 設置配置文件路徑,多個位置使用逗號、分號、空格、制表符、換行 五種方式分割。    
    classPathXmlApplicationContext.setConfigLocation("classpath*:/*.xml");
    classPathXmlApplicationContext.refresh();
}

2、main方法中創(chuàng)建ClassPathXmlApplicationContext對象后會調(diào)用setConfigLocation(String location)方法。
該方法是AbstractRefreshableConfigApplicationContext類中的方法。源代碼如下:

public void setConfigLocation(String location) {
    // 將傳入的字符串,根據(jù)逗號、分號、空格、制表符、換行 五種字符拆分成數(shù)組
    setConfigLocations(StringUtils.tokenizeToStringArray(location, CONFIG_LOCATION_DELIMITERS));
}

該方法中的CONFIG_LOCATION_DELIMITERS是ConfigurableApplicationContext接口中定義的常量。

String CONFIG_LOCATION_DELIMITERS = ",; \t\n";

3、setConfigLocation(String location)方法會調(diào)用StringUtils中的方法。源代碼如下:

// 根據(jù) delimiters字符串中的字符作為分隔符,將str拆分成數(shù)組
public static String[] tokenizeToStringArray(@Nullable String str, String delimiters) {
    return tokenizeToStringArray(str, delimiters, true, true);
}

4、調(diào)用StringUtils中重載的setConfigLocation方法,源代碼如下:
1)該方法中調(diào)用了StringTokenizer類中的hasMoreTokens()方法作為循環(huán)條件。
2)該方法中調(diào)用StringTokenizer類中的nextToken()方法獲取下一個根據(jù)分隔符拆分的字符串。
通過這兩個方法,將設置配置文件的字符串根據(jù)指定的分隔符拆分。

// str 要處理的字符串
// delimiters 分隔符,每個字符都是一個分隔符
// trimTokens 拆分出來的字符串是否要去掉首尾的空格。true表示去掉
// ignoreEmptyTokens 是否忽略空字符串。true表示忽略
public static String[] tokenizeToStringArray(
?? ??? ?@Nullable String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {
?? ?if (str == null) {
?? ??? ?return EMPTY_STRING_ARRAY;
?? ?}
?? ?// 將要操作的字符串和分隔符字符串設置到StringTokenizer對象中
?? ?StringTokenizer st = new StringTokenizer(str, delimiters);
?? ?List<String> tokens = new ArrayList<>();
?? ?while (st.hasMoreTokens()) {
?? ??? ?String token = st.nextToken();
?? ??? ?if (trimTokens) {
?? ??? ??? ?token = token.trim();
?? ??? ?}
?? ??? ?if (!ignoreEmptyTokens || token.length() > 0) {
?? ??? ??? ?tokens.add(token);
?? ??? ?}
?? ?}
?? ?// List集合轉數(shù)組
?? ?return toStringArray(tokens);
}

5、直接使用ClassPathXmlApplicationContext(String configLocation)有參構造,直接設置了配置文件路徑,拆分方式與無參構造不同。

到此這篇關于Java StringTokenizer分隔符拆分字符串的文章就介紹到這了,更多相關Java StringTokenizer拆分字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于SaCheckPermission權限校驗注解

    關于SaCheckPermission權限校驗注解

    在若依框架(RuoYi)的前后端分離版4.8.x中,SaCheckPermission注解用于權限校驗,這個注解可以應用在方法上,以確保只有具有相應權限的用戶才能訪問該方法
    2024-11-11
  • 詳解Spring注解@Autowired的實現(xiàn)原理和使用方法

    詳解Spring注解@Autowired的實現(xiàn)原理和使用方法

    在使用Spring開發(fā)的時候,配置的方式主要有兩種,一種是xml的方式,另外一種是 java config的方式,在使用的過程中,我們使用最多的注解應該就是@Autowired注解了,所以本文就給大家講講@Autowired注解是如何使用和實現(xiàn)的,需要的朋友可以參考下
    2023-07-07
  • 詳解Spring集成Redis的兩種方式

    詳解Spring集成Redis的兩種方式

    在工作中,我們用到分布式緩存的時候,第一選擇就是Redis,今天介紹一下SpringBoot如何集成Redis的,具有一定的參考價值,感興趣的可以了解一下
    2021-09-09
  • java實現(xiàn)猜數(shù)字小游戲(Swing版)

    java實現(xiàn)猜數(shù)字小游戲(Swing版)

    這篇文章主要介紹了java實現(xiàn)猜數(shù)字小游戲,Swing編程版的猜數(shù)字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • java正則表達式判斷 ip 地址是否正確解析

    java正則表達式判斷 ip 地址是否正確解析

    這篇文章主要介紹了java正則表達式判斷 ip 地址是否正確解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Java 文件傳輸助手的實現(xiàn)(單機版)

    Java 文件傳輸助手的實現(xiàn)(單機版)

    這篇文章主要介紹了Java 文件傳輸助手的實現(xiàn)(單機版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Java帶復選框的樹(Java CheckBox Tree)實現(xiàn)和應用

    Java帶復選框的樹(Java CheckBox Tree)實現(xiàn)和應用

    這篇文章主要為大家詳細介紹了Java帶復選框的樹實現(xiàn)和應用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java簡易學生成績系統(tǒng)寫法實例

    Java簡易學生成績系統(tǒng)寫法實例

    在本篇文章里小編給大家分享的是關于Java簡易學生成績系統(tǒng)寫法實例以及相關知識點,有需要的朋友們可以學習下。
    2019-09-09
  • 詳解java CountDownLatch和CyclicBarrier在內(nèi)部實現(xiàn)和場景上的區(qū)別

    詳解java CountDownLatch和CyclicBarrier在內(nèi)部實現(xiàn)和場景上的區(qū)別

    這篇文章主要介紹了詳解java CountDownLatch和CyclicBarrier在內(nèi)部實現(xiàn)和場景上的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • IDEA找不到jdk該如何解決

    IDEA找不到jdk該如何解決

    這篇文章主要給大家介紹了關于IDEA找不到jdk該如何解決的相關資料,剛安裝好IDEA后,我們運行一個項目時候,有時候會遇到顯示找不到Java的JDK,需要的朋友可以參考下
    2023-11-11

最新評論

宁武县| 咸阳市| 木兰县| 叶城县| 晴隆县| 香港 | 乌海市| 大竹县| 高陵县| 长治县| 金湖县| 灵山县| 类乌齐县| 政和县| 龙游县| 固镇县| 黄浦区| 东丽区| 万州区| 应城市| 遵义市| 房产| 秦皇岛市| 驻马店市| 萨嘎县| 静安区| 汝州市| 长武县| 隆尧县| 太仓市| 武安市| 综艺| 墨江| 上蔡县| 东阿县| 广南县| 额济纳旗| 林西县| 搜索| 罗平县| 临澧县|