2017-03-14 38 views
0

我需要製作一個簡單的代碼,它得到一個string和一個array of String,並用陣列的每個元素代替?符號。用字符串替換一組符號的更好方法

這裏是測試用例在JUnit:

@Test 
    public void QueryFitterTest() { 

     ArrayList<String> args=new ArrayList<String>(); 

     args.add("Bad code"); 
     args.add("The code is buggy"); 

     String res = QueryMaker.queryFitter("insert into vulnerability (name,descirption) values(?,?)",args); 
     String correctQuery="insert into vulnerability (name,descirption) values(Bad code,The code is buggy)"; 
     assertEquals(correctQuery, res); 

    } 

這裏是代碼:

public static String queryFitter(String query, ArrayList<String> args){ 

    String[] colapsedQuery = query.split(""); 
    int parmNum=0; 
    for(int i=0;i<colapsedQuery.length;i++){ 
     if(colapsedQuery[i]=="?"){ 
      colapsedQuery[i]=args.get(parmNum); 
      parmNum++; 
     } 

    } 

    query=concatenator(colapsedQuery); 
    return query; 

} 
public static String concatenator(String[] colapsedQuery){ 
    String delimiter = ""; 
    String result = String.join(delimiter, colapsedQuery); 
    System.out.println("query is: "+result); 
    return result; 
} 

的代碼工作正常,但

我不喜歡我的做法,有沒有更簡單的方法來做到這一點?

+2

tl; dr在dup:'colapsedQuery [i] ==「?」'將永遠不會*爲真。 – azurefrog

+1

'colapsedQuery [i] ==「?」'。使用char''?'',並使用'String.charAt(n)' –

+3

如果這是針對SQL的,那麼「更好」的方式IMO就是使用PreparedStatement。如果輸入中有特殊字符會發生什麼? – KevinO

回答

0

有2個問題:

1 - 我的代碼無法通過測試,它返回查詢沒有任何 變化。

查詢是:插入漏洞(姓名,descirption)值

2- 我不喜歡我的做法,是有更簡單的方式做到這一點(?,?)?

好吧,好消息是您的JUnit測試在您的程序中發現了一個錯誤。另一個好消息是你對這兩個問題的答案都是一樣的。只需在方法queryFitter中修復您的代碼即可。

試試下面的代碼:

public static String queryFitter(String query, ArrayList<String> args){ 

    for(int i=0;i<args.size();i++){ 
     query = query.replaceFirst("\\?",args.get(i)); 
    } 

    return query; 
} 

差點忘了告訴你了。您也不需要concatenator方法。

+0

Awsome,謝謝你 – Salman