在字符串

时间:2015-11-14 06:11:21

标签: java string

让我们说我有一个方程式的字符串表示,如 -

  

(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;
    }

然而,这种替代方法的问题是它始终将任何给定数字转换为负数。如何更轻松,更有效地完成工作?

(这是我尝试布尔可满足性问题的方法中的一个元素)

1 个答案:

答案 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