簡體   English   中英

使用StringTokenizer模擬String.split

[英]Simulating String.split using StringTokenizer

我正在將現有應用程序中的代碼轉換為針對自定義硬件的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]

我修改了代碼並對其進行了測試。 它可以工作(不要忘記避免對“,”進行硬編碼,因此您可以將函數用於任何定界符):

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()]);
}

幾乎所有的事情都是對的。 幾乎是因為您忘記了“清除” previous值。 嘗試這個:

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

完全不使用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()]);
}

你可以這樣嘗試

 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;
}

我認為您不應對底層定界符承擔任何責任。

    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()]);
    }

暫無
暫無

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

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