2015-11-14 38 views
1

比方說,我有一個像方程的String表示 -更換底片正片,反之亦然在String

(1-2 3)V(-1 3 2)V(-5 1 4 )v(-4 -2 -3)v(-3 4 5)v(1-25)v(3 -2 5)v(2 3 -4)

我有一種方法需要修改字符串,要替換的數字變量以及應將其設置爲的狀態爲

public String changedString(String original, int num, boolean state) { 

} 

其中用於呼叫作爲

changedString(original, 2, false); 

應返回以下字符串

(1 2 3)V(-1 3 -2)V(-5 1 4)V(-4 2 - 3)v(-3 4 5)v(1 2 5)v(3 2 5)v(-2 3 -4)

請注意,所有2的否定實例(負2s)正實例,而2(正2s)的正實例已被更改爲負實例。

爲了解決這個問題,我最初嘗試String.replaceAll()這顯然不會工作。另一種方法我試過了 -

public String changedString (String original,int num, boolean state){ 
     String temp = original; 
     if (!state) { 
      StringBuilder sb = new StringBuilder(temp); 
      //Following code changes negative instances to positives 
      String from = "-" + num; 
      String to = "" + num; 
      int index = sb.indexOf("-" + num); 
      while (index != -1) { 
       sb.replace(index, index + from.length(), to); 
       index += to.length(); 
       index = sb.indexOf(from, index); 
      } 

      //Following code changes positive instances to negatives 
      from = "" + num; 
      to = "-" + num; 
      index = sb.indexOf("-" + num); 
      while (index != -1) { 
       sb.replace(index, index + from.length(), to); 
       index += to.length(); 
       index = sb.indexOf(from, index); 
      } 
      temp = sb.toString(); 
     } 
     return temp; 
    } 

然而,這種替代方法再次問題是,它總是給定數轉換爲負數。我怎樣才能更輕鬆,更高效地完成工作?

(這是我的方法來嘗試布爾可滿足性問題的一個元素)

+0

難道你不能使用replaceAll,並用'num'替換'「 - 」+ num'? – Tyler

回答

0

您可以使用正則表達式,這String.replaceAll()支持。美中不足的是,你將不得不使用臨時字符表示該數字第一開關狀態:

public String changedString(String original, int num, boolean state) 
{ 
    String str = original.replaceAll("-" + num + "(?!\\d)", "#" + num); 
    str = str.replaceAll("(?<![#0-9])" + num + "(?!\\d)", "-" + num); 
    str = str.replaceAll("#" + num + "(?!\\d)", num); 
    return str; 
} 

這取代的-num#num所有出現,則num-num所有出現,然後用num#num。第一步避免了做-numnum的缺陷,以消除負面影響,然後將所有發生轉換爲-num

這些正則表達式使用lookaround來確保數字正確分隔而不捕獲分隔符。您可以在這裏查看更多信息:http://www.regular-expressions.info/lookaround.html並查看此處的Java語法:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#special