2012-05-27 27 views
1

我正在尋找包含分隔符的StringTokenzier的GWT兼容替代品。任務不能由正則表達式解決,因爲語法不是上下文無關的。如何在GWT中替換StringTokenzier(...,true)?

示例:提取泛型類型定義的第一級。所以對於List<String>, Map<Integer, Map<Character, Boolean>>, Set<List<Double>>,我想要一個包含三個項目的列表。 List<String>Map<Integer, Map<Character, Boolean>>Set<List<Double>>

剝離下來的例子代碼:

private static List<String> extractFirstLevel(String type) { 
    List<String> res = new LinkedList<String>(); 
    StringTokenizer st = new StringTokenizer(type, "<>,", true); 
    int nesting = 0;  // we are only interested in nesting 0 
    String lastToken = ""; 
    while (st.hasMoreTokens()) { 
     String token = st.nextToken(); 
     if (token.equals("<")) { 
      nesting++; // ignore till matching >, but keep track of additional < 
      lastToken = lastToken + "<"; 
     } else if (token.equals(">")) { 
      nesting--; // up one level 
      lastToken = lastToken + ">"; 
     } else if (token.equals(",")) { 
      if (nesting == 0) { // we are interested in the top level 
       res.add(lastToken); 
       lastToken = ""; 
      } else { // this is a , inside a < >, so we are not interested 
       lastToken = lastToken + ", "; 
      } 
     } else { 
      lastToken = lastToken + token.trim(); 
     } 
    } 
    res.add(lastToken); 
    return res; 
} 
+0

你可以使用String.split()方法。通常這對於StringTokenizer來說是一個非常好的選擇,但我不知道獲取標記器返回分隔符的部分。 –

+0

我不認爲split()會讓我感覺到任何地方,因爲它僅用於正則表達式。 – Wassersturm

+0

是的,儘管我的意思是你可以使用「<>」作爲你的正則表達式來分割。它會起作用,但在你的標記器中,你希望它能夠正確地返回分隔符?如果這是100%需要,那麼你堅持使用StringTokenizer,並沒有替代方案存在(我知道)。 –

回答

1

我結束了遍歷字符串的字符:

private static List<String> extractFirstLevelNew(String type) { 
    List<String> res = new LinkedList<String>(); 
    int start = 0; 
    int nesting = 0; 
    for (int i = 0; i < type.length(); i++) { 
     char chr = type.charAt(i); 
     if (chr == '<') { 
      nesting++; 
     } else if (chr == '>') { 
      nesting--; 
     } else if ((chr == ',') && (nesting == 0)) { 
      res.add(type.substring(start, i).trim()); 
      start = i + 1; 
     } 
    } 
    res.add(type.substring(start, type.length()).trim()); 
    return res; 
}