让我们说我有一个方程式的字符串表示,如 -
(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)
我有一个方法可以修改字符串,要替换的数字变量以及应该将其设置为的状态
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(负2)的所有否定实例都已更改为正实例,而2(正2)的正实例已更改为负实例。
为了解决这个问题,我最初尝试了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 :(得分: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
。第一步避免了执行-num
- &gt; num
以删除底片,然后将所有出现转换为-num
的陷阱。
这些正则表达式使用环视来确保正确分隔数字而不捕获分隔符。您可以在此处阅读有关环视的更多信息:http://www.regular-expressions.info/lookaround.html并在此处查找Java语法:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#special。