假设我有一个方程的字符串表示,比如-
(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) v(2 3-4)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);
应该返回以下字符串
(13)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) v(-2 3-4)v (1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(-3 4)v(1 2 5)v(3 2 5)v(-2 3-4)v
注意,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;
}
然而,这种替代方法的问题是,它总是将任何给定的数字转换为负数。我怎样才能更容易和更有效率地做这件事?
(这是我尝试布尔可满足性问题的一个元素)
发布于 2015-11-14 06:30:35
您可以使用正则表达式,这是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
->num
以删除负面的缺陷,然后将所有发生的情况转换为-num
。
这些正则表达式使用查找来确保数字在不捕获分隔符的情况下被正确地分隔。您可以在这里查看更多内容:http://www.regular-expressions.info/lookaround.html,并在这里查找http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#special语法。
https://stackoverflow.com/questions/33705681
复制相似问题