想要删除前面的星号和字符并遵循它,为什么我的代码不起作用

时间:2015-10-26 21:14:23

标签: java string stringbuilder

返回给定字符串的一个版本,对于字符串中的每个星号(*),星号和它左右的字符都消失了。所以“ab * cd”产生“ad”和“ab ** cd”也产生“ad”。这是一个编码蝙蝠问题。

public class DeleteStar {

    public static void main(String[] args) {
        String s=deleteS("ab*ab");
        System.out.println(s);
    }

    public static String deleteS(String s)
    { 
        StringBuilder sb=new StringBuilder();

        for (int i=0;i<s.length();i++)
        {
            sb.append(s.charAt(i));     
        }

        System.out.println(sb.toString());

        for (int i=0;i<sb.length();i++) 
        { 
            if (sb.charAt(i)+""=="*")
            {
                sb.deleteCharAt(i);
                sb.deleteCharAt(i-1);
                sb.deleteCharAt(i+1);
            }
        }

        return sb.toString();
    }
}

4 个答案:

答案 0 :(得分:2)

删除字符时,还会将字符串的长度缩短1.因此,如果您在“ab * cd”上调用序列,假设我们知道i = 2,我们将得到:

sb.deleteCharAt(i); // We now have "abcd"
sb.deleteCharAt(i-1); // We now have "acd"
sb.deleteCharAt(i+1); // Oops! "acd" has no index of 3!

但即使我们已经正确地完成了上述操作,如果我们有两个相邻的恒星,这也会产生问题。所以我们应该在删除之前检查相邻字符是否为星号。例如,如果我们在“ab ** cd”上运行它,我们将得到:

// This is the correct way if no stars are adjacent to each other.
// But if there are? Testing on "ab**cd"
sb.deleteCharAt(i-1); // We now have "a**cd"
sb.deleteCharAt(i-1); // We now have "a*cd"
sb.deleteCharAt(i-1); // We now have "acd"...wait, we need to delete c too!

另一个问题是,在迭代字符串构建器时,您正在修改它。这是一个坏主意,因为你会有错误的指数!考虑以下因素:

// We execute this on "ab*cd*ef", expecting "af".
for (int i = 0; i < sb.length(); i++) { // length = 8
    if (sb.charAt(i) + "" == "*") {
        // First execution, i = 2. Second, i = 5.
        sb.deleteCharAt(i-1);
        sb.deleteCharAt(i-1);
        sb.deleteCharAt(i-1);
        // After we executed the first time, we get that sb's length
        // is now 5! Wait, so next time when we try to delete the i-1 
        // character, we are removing...f? That cannot be right!
    }
}

由于这是一个编码练习,我已经将实际的调试留给了自己。这是一个学习过程,以找出为什么事物是他们的方式! :)

答案 1 :(得分:0)

你必须使用equals方法来比较对象 ==如果它具有相同的值,则检查它是否是同一个实例 即:

 (sb.charAt(i)+""=="*")

shoudl be

 ((sb.charAt(i)+"").equals("*"))

此外,您应该使用string的replace方法 即:

"abxxxcd".replace("xxx","");

我认为*可能会被解释为正则表达式,所以你必须使用\来逃避它(我不确定你是否必须尝试或阅读javadoc)

可以解决这个问题的另一个想法是:

 (sb.charAt(i)=='*')

&#39; *&#39;被解释为一个字符

答案 2 :(得分:0)

那样的解决方案怎么样?

package eu.duernau.stackoverflow;

public class Sov33355763 {

    public static void main(String[] a) {
        String s = deleteS("aba*b");
        System.out.println(s);
        s = deleteS("ab*ab");
        System.out.println(s);
        s = deleteS("ab*cd*ef*ghij*");
        System.out.println(s);
        s = deleteS("0*ab*cd*ef*ghij*");
        System.out.println(s);
        s = deleteS("****acd****");
        System.out.println(s);
    }

    private static String deleteS(String s) {
        StringBuilder sb = new StringBuilder(s);
        int lastStarPosition;
        do {
            lastStarPosition = sb.lastIndexOf("*");            
            if (lastStarPosition > 1 && lastStarPosition + 1 < sb.length()) {
                sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
            } else {
                if (lastStarPosition + 1 == sb.length()) {
                    sb.replace(lastStarPosition - 1, lastStarPosition + 1, "");
                } else {
                    if (lastStarPosition > 0) {
                        sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
                    } else {
                        if (lastStarPosition > -1) {
                            sb.replace(lastStarPosition, lastStarPosition + 2, "");
                        }
                    }
                }
            }
        } while (lastStarPosition > -1);
        return sb.toString();
    }
}

产生

ab
ab
ahi
hi
d

答案 3 :(得分:0)

我只看到Regular Expressions发生了这种情况:

代码:

String pattern1 = ".?[*]+.?";
s = s.replaceAll(pattern1, "");