【问题标题】:Java StringTokenizer with empty tokens带有空标记的 Java StringTokenizer
【发布时间】:2014-10-19 11:08:22
【问题描述】:

我有一个字符串,看起来像 - 56,0,76,0,93,,,,,,,1230。 我使用 StringTokenizer 将其拆分为“,”。但是,这似乎是从 93 直接跳到 1230。有没有办法让它在移动到 1230 之前返回六个空字符串?

【问题讨论】:

  • 你检查过 java.util.Scanner 吗?

标签: java stringtokenizer


【解决方案1】:

使用StringTokenizer(String str, String delim, boolean returnDelims) 并将returnDelims 设置为true

如果 returnDelims 标志为真,则分隔符也作为标记返回。每个分隔符都作为长度为 1 的字符串返回。

【讨论】:

    【解决方案2】:

    改用String.split() 方法。

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

    这将返回一个字符串数组。

    【讨论】:

    • 如果逗号在字符串的末尾或开头,这将不起作用。看我的回答
    • @user3218114,实际上,确实如此。我刚刚尝试运行它。
    • 试试,,-56,0,76,0,93,,,,,,,1230,
    【解决方案3】:

    String.split(",",-1); 如果没有 -1,它将忽略尾随分隔符

    【讨论】:

    • 即使不放-1,也不会忽略尾随分隔符。
    【解决方案4】:

    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, ]
    

    【讨论】:

    • 我同意你的答案应该是正确的。
    【解决方案5】:

    StringTokenizer 有一个构造函数,它接受 3 个参数,第三个参数是一个布尔值,用于控制分隔符是否作为标记返回。您应该将其设置为 true。

    new StringTokenizer(yourString, yourDelimiters, true);
    

    现在分隔符也返回了,通过检查两个连续的标记是否为分隔符,很容易判断是否存在空字符串。

    您可以扩展分词器或编写自己的包装类以进行重用。

    【讨论】:

      【解决方案6】:

      使用 Google 的 Guava 库 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
      

      【讨论】:

        【解决方案7】:

        请找一份工作副本来克服 Empty Token

        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]
        

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-02
          • 1970-01-01
          相关资源
          最近更新 更多