Java 使用StringBuffer删除DUP的方法

Java 使用StringBuffer删除DUP的方法,java,string,stringbuffer,Java,String,Stringbuffer,我正在编写一个使用StringBuffer从字符串中删除DUP的方法。该方法正在返回StringIndexOutOfBoundsException。我怎样才能修好它 public static void removeDups( String myString ){ StringBuffer sb = new StringBuffer( myString ); int len = myString.length(); for ( int j

我正在编写一个使用StringBuffer从字符串中删除DUP的方法。该方法正在返回StringIndexOutOfBoundsException。我怎样才能修好它

public static void removeDups( String myString ){

        StringBuffer sb = new StringBuffer( myString );
        int len =  myString.length(); 

        for ( int j = 0; j < len; j++ ){

            char c = sb.charAt(j);

            for ( int k = len - 1 ; k > j ; k-- ){

                if ( sb.charAt(k) == c ){

                    sb.deleteCharAt(k);
                    len--; 
                }

            }
        }

        System.out.println("After deleting the dups : " + sb.toString() ); 
    } 
publicstaticvoidremovedups(stringmystring){
StringBuffer sb=新的StringBuffer(myString);
int len=myString.length();
对于(int j=0;jj;k--){
如果(b.字符(k)=c){
某人(k);
蓝--;
}
}
}
System.out.println(“删除DUP后:+sb.toString());
} 
如果您试图向下迭代,则它必须是
k--
,而不是
k++
。现在,第二次迭代将有
k=len
,这超出了范围。你正在无限地向上更新,而不是向下更新

您还缺少一个括号:它需要

 if ( sb.charAt(k) == c ) {
    sb.deleteCharAt(k);
    len--; 
 }
(在我们进行此项工作时,基本上没有理由使用
StringBuffer
而不是
StringBuilder
,后者提供了~相同的API而没有同步开销。)

如果您试图向下迭代,则它必须是
k--
,而不是
k++
。现在,第二次迭代将有
k=len
,这超出了范围。你正在无限地向上更新,而不是向下更新

您还缺少一个括号:它需要

 if ( sb.charAt(k) == c ) {
    sb.deleteCharAt(k);
    len--; 
 }
(在我们进行此项工作时,基本上没有理由使用
StringBuffer
而不是
StringBuilder
,后者提供了~相同的API而没有同步开销。)

如果您试图向下迭代,则它必须是
k--
,而不是
k++
。现在,第二次迭代将有
k=len
,这超出了范围。你正在无限地向上更新,而不是向下更新

您还缺少一个括号:它需要

 if ( sb.charAt(k) == c ) {
    sb.deleteCharAt(k);
    len--; 
 }
(在我们进行此项工作时,基本上没有理由使用
StringBuffer
而不是
StringBuilder
,后者提供了~相同的API而没有同步开销。)

如果您试图向下迭代,则它必须是
k--
,而不是
k++
。现在,第二次迭代将有
k=len
,这超出了范围。你正在无限地向上更新,而不是向下更新

您还缺少一个括号:它需要

 if ( sb.charAt(k) == c ) {
    sb.deleteCharAt(k);
    len--; 
 }

(当我们进行调试时,基本上没有理由使用
StringBuffer
而不是
StringBuilder
,后者提供了~相同的API,没有同步开销。)

您尝试过调试吗?从技术上讲,它不会返回
StringIndexOutOfBoundsException
,而是抛出它。供将来参考。您是否尝试过调试?从技术上讲,它不会返回
StringIndexOutOfBoundsException
而是抛出它。供将来参考。您是否尝试过调试?从技术上讲,它不会返回
StringIndexOutOfBoundsException
而是抛出它。供将来参考。您是否尝试过调试?从技术上讲,它不会返回
StringIndexOutOfBoundsException
而是抛出它。供将来参考。是的,没错。我更改了它,但是,该方法仍然删除了一个重复。比如说,当我把“njznj”放进去时,它会打印“njzj”。谢谢你提到这个括号。我还编写了一些Python,并认为它将包括两行,没有括号。现在,程序很好,感谢您的努力。而且“当我们正在进行时”,从StringBuilder中重复删除字符(或短子字符串)几乎总是比复制应该保留的部分慢得多,因为delete必须在删除点之后移动所有文本。是的,这是正确的。我更改了它,但是,该方法仍然删除了一个重复。比如说,当我把“njznj”放进去时,它会打印“njzj”。谢谢你提到这个括号。我还编写了一些Python,并认为它将包括两行,没有括号。现在,程序很好,感谢您的努力。而且“当我们正在进行时”,从StringBuilder中重复删除字符(或短子字符串)几乎总是比复制应该保留的部分慢得多,因为delete必须在删除点之后移动所有文本。是的,这是正确的。我更改了它,但是,该方法仍然删除了一个重复。比如说,当我把“njznj”放进去时,它会打印“njzj”。谢谢你提到这个括号。我还编写了一些Python,并认为它将包括两行,没有括号。现在,程序很好,感谢您的努力。而且“当我们正在进行时”,从StringBuilder中重复删除字符(或短子字符串)几乎总是比复制应该保留的部分慢得多,因为delete必须在删除点之后移动所有文本。是的,这是正确的。我更改了它,但是,该方法仍然删除了一个重复。比如说,当我把“njznj”放进去时,它会打印“njzj”。谢谢你提到这个括号。我还编写了一些Python,并认为它将包括两行,没有括号。现在,程序很好,感谢您的努力。而且“当我们正在进行时”,从StringBuilder中重复删除字符(或短子字符串)几乎总是比复制应该保留的部分慢得多,因为delete必须在删除点之后移动所有文本。