2014-10-01 43 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