簡體   English   中英

Java 帶有空標記的 StringTokenizer

[英]Java StringTokenizer with empty tokens

我有一個看起來像 - 56,0,76,0,93,,,,,,,1230 的字符串。 我使用 StringTokenizer 將其拆分為“,”。 然而,這似乎是從 93 直接跳到 1230。有沒有辦法讓它在移動到 1230 之前返回六個空字符串?

請改用String.split()方法。

String str = "56,0,76,0,93,,,,,,,1230";
String[] stringArr = str.split(",");

這將返回一個String數組。

StringTokenizer有一個構造函數,它接受3個參數,第三個是一個布爾值,它控制是否將分隔符作為標記返回。 您應該將其設置為true。

new StringTokenizer(yourString, yourDelimiters, true);

現在也返回分隔符,通過檢查兩個連續的標記是否是分隔符,很容易判斷是否存在空字符串。

您可以擴展tokenizer或編寫自己的包裝類以供重用。

使用StringTokenizer(String str, String delim, boolean returnDelims)並將returnDelims設置為true

如果returnDelims標志為true,則分隔符字符也將作為標記返回。 每個分隔符都以長度為1的字符串形式返回。

String.split( “”, - 1); 如果沒有-1,它將忽略尾隨分隔符

使用String#split(regex,limit)limit為-1

示例代碼:

System.out.println(Arrays.toString(",,-56,0,76,0,93,,,,,,,1230,".split(",",-1)));

輸出:

[, , -56, 0, 76, 0, 93, , , , , , , 1230, ]

我有這個答案..這與前一個類似..據我所知它沒有錯誤..基於最后使用 StringTokenizer 和 true arguments。

// inputs:  text, delimiters
    Vector tokens;
    tokens = new Vector();
    boolean lastissep = false;
    tokenizer = new StringTokenizer(text, delimeters,true);
    while (tokenizer.hasMoreTokens()) {
        Object o = tokenizer.nextElement();
        if (((String)(o)).equals(delimeters))
        {
            tokens.addElement("");
            lastissep = true;
        }
        else
        {
            tokens.addElement(o);
            lastissep = false;
            if (tokenizer.hasMoreTokens()) 
            {
                tokenizer.nextElement();
                lastissep = true;
            }   
        }   
          
    }
    if (lastissep)
        tokens.addElement("");

使用Google的Guava lib Splitter

String str = "56,0,76,0,93,,,,,,,1230";
Iterable<String> splitResult = Splitter.on(",").split(str);

並轉換為ArrayList

ArrayList<String> elementList = Lists.newArrayList(splitResult);

elementList.size(); // 12

請查找工作副本以克服空令牌

public class TestStringTokenStrict {

/**
 * Strict implementation of StringTokenizer
 * 
 * @param str
 * @param delim
 * @param strict
 *            true = include NULL Token
 * @return
 */
static StringTokenizer getStringTokenizerStrict(String str, String delim, boolean strict) {
    StringTokenizer st = new StringTokenizer(str, delim, strict);
    StringBuffer sb = new StringBuffer();

    while (st.hasMoreTokens()) {
        String s = st.nextToken();
        if (s.equals(delim)) {
            sb.append(" ").append(delim);
        } else {
            sb.append(s).append(delim);
            if (st.hasMoreTokens())
                st.nextToken();
        }
    }
    return (new StringTokenizer(sb.toString(), delim));
}

static void altStringTokenizer(StringTokenizer st) {
    while (st.hasMoreTokens()) {
        String type = st.nextToken();
        String one = st.nextToken();
        String two = st.nextToken();
        String three = st.nextToken();
        String four = st.nextToken();
        String five = st.nextToken();

        System.out.println(
                "[" + type + "] [" + one + "] [" + two + "] [" + three + "] [" + four + "] [" + five + "]");
    }
}

public static void main(String[] args) {
    String input = "Record|One||Three||Five";
    altStringTokenizer(getStringTokenizerStrict(input, "|", true));
}}

輸出將是

[Record] [One] [ ] [Three] [ ] [Five]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM