2011-02-18 65 views
0

我正在致力於一個名爲Quiz的系統...替換/被刪掉已刪除/刪除內容

剩下的最後一件事就是'線索'。在目前我還

<id value="100"> 
     <question value="Who said E=mc2"/> 
     <answear value="Einstein"/> 
     <clue1 value="E*******"/> 
     <clue2 value="E******n"/> 
     <clue3 value="Ei****in"/> 
    </id> 

,我想從XML刪除的線索,因爲很難做手工他們... 所以我做了什麼,但我失敗了

public class Test 
{ 
    public static void main(String[] argv) throws Exception 
    { 
     System.out.println(replaceSubString("Einstein", "*", 3)); 
    } 

    static String[] letters = {"e","i"}; 

    public static String replaceSubString(final String str, final String newToken, int max) 
    { 
     if ((str == null) || (newToken == null)) 
     return str; 

     StringBuffer buf = new StringBuffer(str.length()); 
     int start = 0, end = 0; 

     for(int i = 0; i < letters.length; i++) 
     { 
      if(Rnd.get(100) > 50) //50% to add the symbol 
      { 
       while ((end = str.indexOf(letters[i], start)) != -1) 
       { 
        buf.append(str.substring(start, end)).append(newToken); 
        start = end + 1; 
        if (--max == 0) 
         break; 
       } 
      } 
     } 

     buf.append(str.substring(start)); 
     return buf.toString(); 
    } 
} 

編譯結果=>' Einst *在

循環就不會工作。IDK ..只被替換從數組的第一個字母...

,如果有人提供幫助我,我將不勝感激..

- 謝謝!

+0

要生成的線索,這就是它? – 2011-02-18 13:42:03

+0

循環確實有效,也許你應該測試更多的文字和字母? – Ishtar 2011-02-18 13:47:57

+0

@Nicolas Repiquet - 是的..就是這樣 – 2011-02-18 14:15:45

回答

3

這樣的事情呢?

public String generatClue(String answer,int level){ 
    if(level >= answer.length()/2) 
     return answer.replaceAll("[^ ]","*"); 

    return answer.substring(0,level) 
     + answer.substring(level,answer.length()-level).replaceAll("[^ ]","*") 
     + answer.substring(answer.length()-level); 
} 

輸出:

generateClue("Einstein",1); 
=> E******n 
generateClue("Einstein",3); 
=> Ein**ein 
generateClue("Einstein",4) 
=> Einstein 
generateClue("Hans Christian Andersen",4) 
=> Hans ********* ****rsen 

編輯:這是一個字符串中的隨機字符:

public String generatClue2(String answer,int level){ 
    if(answer.length()==level) 
     return answer.replaceAll("[^ ]","*"); 

    Random rand=new Random(); 

    for(int i=0; i<level; ++i){ 
     char c; 
     int n; 
     do{ 
      n=rand.nextInt(answer.length()); 
      c=answer.charAt(n); 
     } 
     while(c == ' ' || c == '*'); 
     answer = answer.substring(0,n) + '*' + answer.substring(n+1); 
    } 
    return answer; 
} 

輸出:

generateClue2("Hans Christian Andersen",4); 
=> Han* C*ri*tian Ande*sen 
generateClue2("Hans Christian Andersen",4); 
=> *ans Chr*sti*n An*ersen 
generateClue2("Hans Christian Andersen",17); 
=> H**s ******i** ***e**** 
generateClue2("Hans Christian Andersen",23); 
=> **** ********* ******** 
1

爲什麼不使用類似JDOM的東西,並通過名稱獲取XML元素?

SAXBuilder b = New SAXBuilder(); 
Document doc = b.build(pathToFile); 
List<?> elements = b.getChildren("clue"); 
for (Element e : elements) { 
    (Element) e.setAttribute("value", 
    obfuscateClueText(e.getAttribute("value")); //updated, see below 
} 

作爲對您的評論的迴應,您能否編寫一種方法來生成隨機線索符號?

private String obfuscateClueText(String clueValue) { 
    //do something with clueValue 
    return obfuscatedValue; 
} 
0

我這個方法之前試過

public class Test 
{ 
    static String s = "Hans Christian Andersen"; 

    public static void main(String[] args) 
    { 
     char c = '*'; 
     System.out.println(replaceCharAt(s, 0, c)); 
    } 

    public static String replaceCharAt(String s, int pos1, char c) 
    { 
     StringBuffer buf = new StringBuffer(s); 
     int max = (s.length()-3), contor = 0; 

     while (contor < max) 
     { 
      for(int i = pos1; i < (s.length()); i++) 
      { 
       if(Rnd.get(100) > 50 && contor < max) 
       { 
        buf.setCharAt(i, c); 
        contor++; 
       } 
      } 
     } 

     return buf.toString(); 
    } 
} 

問題是從字符串「空格」 ..

output: ***s*******i*n *nde**e*