2014-10-01 42 views
3
String s = "ab#cd#ef#gh#"; 
String regex = "#"; 

char [] sChar = s.toCharArray(); 
char [] regexChar = regex.toCharArray(); 

int count = 1; 
for (int i = 0; i < regexChar.length; i++){ 
    for (int j = 0; j < sChar.length; j++){ 
     if (regexChar [i] == sChar[j]){ 
      count += 2; 
     } 
    } 
} 

String [] splitS = new String [count]; 
String temp; 
for (int k = 0; k < count; k++){ 
    temp = ""; 
    for (int i = 0; i < regexChar.length; i++){ 
     for (int j = 0; j < sChar.length; j++){ 
      if (regexChar[i] == sChar[j]){ 
       temp = Character.toString(regexChar[i]); 
      } 
      else { 
       temp = temp + Character.toString(sChar[j]); 
      } 
     } 
    } 
    splitS[k] = temp; 
} 

這是我的代碼,但它給了我splitS[#,#,#,#,#,#,#,#]。但它應該是splitS[ab,#,cd,#,ef,#,gh,#]。誰能告訴我爲什麼這樣做?不使用String.split()分割一個字符串 - 並返回分隔符

+0

by regexChar你的意思是分割? – damienix 2014-10-01 20:33:14

+0

'regex'會比1個字符長嗎? – jedwards 2014-10-01 20:33:35

+1

爲什麼不使用'StringTokenizer'? – 2014-10-01 20:33:55

回答

2

我想使用現有的,標準類的意見應認真考慮,但只是爲了好玩,一下一下:

import java.util.ArrayList; 

class Splitter{ 
    static ArrayList<String> tokenize(String subject, String pattern) 
    { 
     ArrayList<String> tokens = new ArrayList<>(); 

     int tokenOff = 0; 
     while(true) 
     { 
      int tokenPos = subject.indexOf(pattern, tokenOff); 
      if(tokenPos == -1){ break; } 
      String tok = subject.substring(tokenOff, tokenPos); 

      addToken(tokens, tok); 
      addToken(tokens, pattern); 

      tokenOff = (tokenPos + pattern.length()); 
     } 
     // Add any remaining characters 
     addToken(tokens, subject.substring(tokenOff)); 

     return tokens; 
    } 

    static void addToken(ArrayList<String> list, String tok) 
    { 
     if(tok.length() > 0){ list.add(tok); } 
    } 

    public static void main(String args[]) 
    { 
     String subject, pattern; 
     ArrayList<String> tokens; 

     subject = "ab#cd#ef#gh#"; 
     pattern = "#"; 
     tokens = tokenize(subject, pattern); 
     System.out.println(tokens); // [ab, #, cd, #, ef, #, gh, #] 

     subject = "ab##cd##ef##gh##"; 
     pattern = "##"; 
     tokens = tokenize(subject, pattern); 
     System.out.println(tokens); // [ab, ##, cd, ##, ef, ##, gh, ##] 

     subject = "ab##cd##ef##gh##ij"; 
     pattern = "##"; 
     tokens = tokenize(subject, pattern); 
     System.out.println(tokens); // [ab, ##, cd, ##, ef, ##, gh, ##, ij] 

     subject = "ab##cd#ef#gh##ij"; 
     pattern = "##"; 
     tokens = tokenize(subject, pattern); 
     System.out.println(tokens); // [ab, ##, cd#ef#gh, ##, ij] 
    } 
} 
+0

謝謝這真的有助於解釋很多 – MafiaBlood 2014-10-01 20:58:09

+0

在我看來這是很大的。他需要工作邏輯。給純粹的OOO代碼添加額外的令牌過濾功能,使新手對其理解起來難度更大。 – damienix 2014-10-01 21:14:36

+0

@damienx,我不知道你的意思是「太大」。至少有一半的代碼是說明示例的主要功能。如果「短」代碼是你正在尋找的,那麼肯定會使用標準庫。在這裏沒有面向對象 - 只有兩個靜態函數。 – jedwards 2014-10-01 21:17:05

1

做什麼u需要。擺脫所有不必要和不安全的廢話。

public static String[] split(String s, String regex) { 
    List<String> result = new ArrayList<>(); 
    int beginning = 0; 
    for (int i = 0; i < s.length(); i++) { 
     if (s.substring(i).startsWith(regex)) { 
      // if you need splitter in output array 
      if (!result.isEmpty()) { 
       result.add(regex); 
      } 
      result.add(s.substring(beginning, i)); 

      // Move forward for splitter size 
      i += regex.length(); 
      beginning = i; 
     } 
    } 

    // Optionally if you really need an array instead 
    String[] splitS = new String[result.size()]; 
    result.toArray(splitS); 
    return splitS; 
} 
+0

哇,我沒意識到我在做這麼多沒用的東西。謝謝 – MafiaBlood 2014-10-01 20:58:47

+0

除此之外,你的版本容易受到不同分路器尺寸的影響 – damienix 2014-10-01 21:01:54

+0

我的老師並沒有真正測試過,我希望他這樣做會讓我變得更好,並幫助我在現實世界中人們破壞程序。我總是儘量讓自己的代碼變得最脆弱,我非常感謝幫助和提示 – MafiaBlood 2014-10-01 21:07:50