【问题标题】:Simulating String.split using StringTokenizer使用 StringTokenizer 模拟 String.split
【发布时间】:2013-07-11 08:42:32
【问题描述】:

我正在转换现有应用程序的代码以针对 Java 1.1 编译器进行编译,以用于定制硬件。这意味着我不能使用 String.split(regex) 将我现有的字符串转换为数组。

我创建了一个方法,它应该给出与String.split(regex) 相同的结果,但它有问题,我不知道是什么。

代码:

private static String[] split(String delim, String line) {
  StringTokenizer tokens = new StringTokenizer(line, delim, true);
  String previous = "";
  Vector v = new Vector();

  while(tokens.hasMoreTokens()) {
    String token = tokens.nextToken();

    if(!",".equals(token)) {
      v.add(token);
    } else if(",".equals(previous)) {
      v.add("");
    } else {
      previous = token;
    }
  }

  return (String[]) v.toArray(new String[v.size()]);
}

示例输入:

RM^RES,0013A2004081937F,,9060,1234FF

示例输出:

String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = split(",", line);

for(String s : items) {
    System.out.println(" [ " + s + " ] ");
}

[RM^RES][0013A2004081937F][][][9060][][1234FF]

期望的输出:

[RM^RES][0013A2004081937F][][9060][1234FF]


我正在尝试转换的旧代码:

String line = "RM^RES,0013A2004081937F,,9060,1234FF";
String[] items = line.split(",");

for(String s : items) {
    System.out.println(" [ " + s + " ] ");
}

[RM^RES][0013A2004081937F][][9060][1234FF]

【问题讨论】:

  • 如果您打算使用其他分隔符,您可能希望在拆分方法中将 ",".equals(...) 替换为 delim.equals(...)
  • @haraldK 谢谢,这句话很好地解决了这个问题:)

标签: java stringtokenizer


【解决方案1】:

我修改了代码并对其进行了测试。它可以工作(不要忘记对“,”进行硬编码,这样您就可以将该函数用于任何分隔符):

private static String[] split(String delim, String line) {

    StringTokenizer tokens = new StringTokenizer(line, delim, true);
    String previous = delim;
    Vector v = new Vector();

    while (tokens.hasMoreTokens()) {
        String token = tokens.nextToken();

        if (!delim.equals(token)) {
            v.add(token);
        } else if (previous.equals(delim)) {
            v.add("");
        }
        previous = token;
    }

    return (String[]) v.toArray(new String[v.size()]);
}

【讨论】:

    【解决方案2】:

    几乎一切都是正确的。几乎,因为您忘记“清除”previous 的值。 试试这个:

    if(!",".equals(token)) {
      v.add(token);
      previous = "";
    } else if(",".equals(previous)) {
      v.add("");
      previous = "";
    } else {
      previous = token;
    }
    

    【讨论】:

    • 这仍然给我不正确的输出。 [ RM^RES ] [ 0013A2004081937F ] [ ] [ 9060 ] [ ] [ 1234FF ]
    • 尝试将 previous = token 也放入 if{} 中
    • 之后就可以了,但是 Andrei M 已经给出了更好的解决方案。还是谢谢。
    【解决方案3】:

    根本不使用 StringTokenizer 怎么样:

    private static String[] split(String delim, String line) {
        String current = line;
        int index = line.indexOf(delim);
        Vector vector = new Vector();
        while (index != -1) {
            vector.add(current.substring(0, index));
            current = current.substring(index + 1);
            index = current.indexOf(delim);
        }
        vector.add(current);
    
        return (String[]) vector.toArray(new String[vector.size()]);
    }
    

    【讨论】:

      【解决方案4】:

      你可以这样试试

       public static void main(String[] args) throws ParseException {
          for (String s : split(",", "RM^RES,0013A2004081937F, ,9060,1234FF")) {
              System.out.print(" [ " + s + " ] ");
          }
        }
      
      private static String[] split(String delim, String line) {
          StringTokenizer tokens = new StringTokenizer(line, delim);
          String[] v = new String[tokens.countTokens()];
          int i = 0;
          while (tokens.hasMoreTokens()) {
              v[i] = tokens.nextToken();
              i++;
          }
          return v;
      }
      

      【讨论】:

      • 这不起作用,因为我的数组也将包含分隔符。它看起来像这样:[ RM^RES ] [ , ] [ 0013A2004081937F ] [ , ] [ , ] 等。另外,您更改了我的字符串以在逗号之间添加一个空格,我无法更改输入,因为它是必须遵循的协议。
      【解决方案5】:

      我认为你不应该假设任何关于底层分隔符的事情。

          public static String[] split(String line, String delim) {
              Vector v = new Vector();
              final String EMPTY_STRING = "";
              StringTokenizer st = new StringTokenizer(line, delim, true);
              while (st.hasMoreTokens()) {
                  String token = st.nextToken();
      
                  if (token.equals(delim)) {
                      if (v.isEmpty() || v.size() > 0 && !EMPTY_STRING.equals(v.get(v.size() - 1))) {
                          v.add(EMPTY_STRING);
                      }
                  } else {
                      v.add(token);
                  }
              }
      
              return (String[])v.toArray(new String[v.size()]);
          }
      

      【讨论】:

      • 这不起作用,因为每次我得到一个分隔符时,它都会添加一个空字符串,我的数组将如下所示:[ RM^RES ] [ ] [ 0013A2004081937F ] [ ] [ ] 等。基本上每个逗号都会变成一个空数组槽。
      猜你喜欢
      • 2010-11-02
      • 2010-10-16
      • 2013-11-09
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多