【问题标题】:Java StringTokenizer, empty null tokensJava StringTokenizer,空的空标记
【发布时间】:2011-02-12 02:37:02
【问题描述】:

我正在尝试将一个字符串拆分为 29 个标记..... stringtokenizer 不会返回空标记。我试过 string.split,但我相信我做错了什么:

String [] strings = line.split(",", 29);

样本输入:

10150,15:58,23:58,16:00,00:00,15:55,23:55,15:58,00:01,16:03,23:58,,,,,16:00,23:22,15:54,00:03,15:59,23:56,16:05,23:59,15:55,00:01,,,,
10155,,,,,,,,,,,07:30,13:27,07:25,13:45,,,,,,,,,,,07:13,14:37,08:01,15:23
10160,10:00,16:02,09:55,16:03,10:06,15:58,09:48,16:07,09:55,16:00,,,,,09:49,15:38,10:02,16:04,10:00,16:00,09:58,16:01,09:57,15:58,,,,

【问题讨论】:

    标签: java string stringtokenizer string-split


    【解决方案1】:

    如果您希望保留尾随的空字符串,但又不想为最大值提供幻数,请使用负数限制:

    line.split(",", -1)
    

    如果line.equals("a,,c"),那么line.split(",", -1)[1].isEmpty();不是null。这是因为当"," 是分隔符时,",," 在两个分隔符之间有一个空字符串,而不是null。


    示例:

    使用上面的解释,考虑以下示例:",,"

    尽管您可能期望","、null 和","。

    实际结果为","、""和","


    如果您想要null 而不是split 返回的数组中的空字符串,那么您必须手动扫描数组并将它们替换为null。不过,我不确定为什么 s == null 比 s.isEmpty() 更好。

    另见

    【讨论】:

    • 我检查错了。 29 确实有效。 -1 也是。谢谢
    • 是的,我注意到了。我只是检查字符串是否为空而不是 null。
    • @user69:如果是 Java6,则使用 isEmpty(),否则使用 length() == 0。不要使用equals("")。
    【解决方案2】:

    在Apache Commons Lang 库中使用StringUtils.splitPreserveAllTokens()

    【讨论】:

      【解决方案3】:

      如果您想保留 空令牌,string.split 将无法令人满意地工作。 StringTokenizer 也不起作用。 我提供了以下方法,可能对你有帮助

      public static String[] splitTotokens(String line, String delim){
        String s = line;
        int i = 0;
      
        while (s.contains(delim)) {
        s = s.substring(s.indexOf(delim) + delim.length());
            i++;
        }
        String token = null;
        String remainder = null;
        String[] tokens = new String[i];
      
        for (int j = 0; j < i; j++) {
          token = line.substring(0, line.indexOf(delim));
          //System.out.print("#" + token + "#");
          tokens[j] = token;
          remainder = line.substring(line.indexOf(delim) + delim.length());
          //System.out.println("#" + remainder + "#");
          line = remainder;
          }
      
        return tokens;`  
       }
      

      【讨论】:

        【解决方案4】:

        如果您希望保留空令牌string.split() 将无法令人满意地工作。 StringTokenizer 也不起作用。我提供了以下方法,可能对您有所帮助:

        public static String[] splitTotokens(String line, String delim){
            String s = line;
            int i = 0;
        
            while (s.contains(delim)) {
                s = s.substring(s.indexOf(delim) + delim.length());
                i++;
            }
            String token = null;
            String remainder = null;
            String[] tokens = new String[i];
        
            for (int j = 0; j < i; j++) {
                token = line.substring(0, line.indexOf(delim));
                // System.out.print("#" + token + "#");
                tokens[j] = token;
                remainder = line.substring(line.indexOf(delim) + delim.length());
                //System.out.println("#" + remainder + "#");
        
                line = remainder;
            }
            return tokens;
        }
        

        【讨论】:

          【解决方案5】:
          use this org.springframework.util.StringUtils
          
          org.springframework.util.StringUtils.delimitedListToStringArray(data, delimit);
          

          这个类提供了一些简单的功能,提供了易于使用的方法来在分隔字符串(例如 CSV 字符串)与集合和数组之间进行转换。

          【讨论】:

            猜你喜欢
            • 2014-10-19
            • 1970-01-01
            • 2010-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多