Java 删除字符串中的重复项并创建新字符串

Java 删除字符串中的重复项并创建新字符串,java,string,replace,duplicates,Java,String,Replace,Duplicates,我是Java新手,正在尝试创建一种方法,该方法允许我删除字符串中的重复字符,并创建一个新字符串,将同一字符的所有连续出现转换为单个字符。例如,字符串fffgghhh将返回为fgh。我已经在下面提供了我的代码,但是我收到了一个索引超出范围的错误,该错误与我输入的字符串的长度有关。例如,当测试此方法并输入AA作为我的字符串时,我收到一个索引超出范围2的错误 公共字符串重复测试(字符串s){ StringBuilder结果=新建StringBuilder(); 对于(inti=1;i字符串是基于0的索

我是Java新手,正在尝试创建一种方法,该方法允许我删除字符串中的重复字符,并创建一个新字符串,将同一字符的所有连续出现转换为单个字符。例如,字符串
fffgghhh
将返回为
fgh
。我已经在下面提供了我的代码,但是我收到了一个索引超出范围的错误,该错误与我输入的字符串的长度有关。例如,当测试此方法并输入
AA
作为我的字符串时,我收到一个索引超出范围2的错误

公共字符串重复测试(字符串s){
StringBuilder结果=新建StringBuilder();

对于(inti=1;i字符串是基于0的索引

根据您的输入,如果重复字符是连续的顺序,则可以将输入字符串中的第一个字符存储到结果StringBuilder中

另外,在您的代码中,prev总是以0开头,这是错误的。您也需要保持它的增量

以下是您的代码的固定版本:

public static String DuplicatesTEST(String s) {
    StringBuilder result = new StringBuilder();
    result.append(s.charAt(0));
    for (int i = 1; i < s.length(); i++) {
        char prev = s.charAt(i);
        char curr = s.charAt(i - 1);
        if (curr != prev || i == 0) {
            result.append(prev);
        }
        else if (curr == prev) {
            prev = curr;
        }
    }
    return result.toString();
}
公共静态字符串重复测试(字符串s){
StringBuilder结果=新建StringBuilder();
结果:追加(s.charAt(0));
对于(int i=1;i
字符串是基于0的索引

根据您的输入,如果重复字符是连续的顺序,则可以将输入字符串中的第一个字符存储到结果StringBuilder中

另外,在您的代码中,prev总是以0开头,这是错误的。您也需要保持它的增量

以下是您的代码的固定版本:

public static String DuplicatesTEST(String s) {
    StringBuilder result = new StringBuilder();
    result.append(s.charAt(0));
    for (int i = 1; i < s.length(); i++) {
        char prev = s.charAt(i);
        char curr = s.charAt(i - 1);
        if (curr != prev || i == 0) {
            result.append(prev);
        }
        else if (curr == prev) {
            prev = curr;
        }
    }
    return result.toString();
}
公共静态字符串重复测试(字符串s){
StringBuilder结果=新建StringBuilder();
结果:追加(s.charAt(0));
对于(int i=1;i
数据结构的行为
集合
不包含重复项,因此使用
集合
删除重复项。
试着这样做:

公共字符串重复测试(字符串s){
Set=newhashset();
StringBuilder结果=新建StringBuilder();
对于(int i=0;i
对于
fffgghhhff
输入此返回值
fgh

如果您想使用上面的块删除重复项解决方案没有帮助,那么我对您的实现做了一些小改动:

公共字符串重复测试(字符串s){
StringBuilder结果=新建StringBuilder();
如果(s!=null&&!s.isEmpty()){
char first=s.charAt(0);
对于(int i=1;i

对于
FFFGGGHHFF
输入此返回值
fghf

数据结构的行为
Set
不包含重复项,因此使用
Set
删除重复项。
试着这样做:

公共字符串重复测试(字符串s){
Set=newhashset();
StringBuilder结果=新建StringBuilder();
对于(int i=0;i
对于
fffgghhhff
输入此返回值
fgh

如果您想使用上面的块删除重复项解决方案没有帮助,那么我对您的实现做了一些小改动:

公共字符串重复测试(字符串s){
StringBuilder结果=新建StringBuilder();
如果(s!=null&&!s.isEmpty()){
char first=s.charAt(0);
对于(int i=1;i

对于
FFFGGGHHFF
输入此返回值
fghf

您可以将方法转换为递归并使用regexp。这大大简化了代码

publicstaticstringremoveduplicates(stringstr){
如果(str.equals(str=str.replaceAll(“(..\\1”),“$1”))
返回str;
其他的
返回移除的副本(str);
}
publicstaticvoidmain(字符串[]args){
System.out.println(移除的副本(“aaaaaaaaaaa”);//a
System.out.println(移除的副本(“fffgghh”);//fgh
System.out.println(移除的副本(“FFFGGGHHFF”);//fghf
}
说明:

  • regexp
    ()\\1
    -后跟相同字符的任何字符;
    • regexp
      $1
      -替换为第一组中的一个字符,即相同的字符
  • str=str.replaceAll(…)
    -删除所有重复项并替换当前字符串
  • str.equals(…)
    -检查当前字符串与自身的相等性,但不重复


另请参见:

您可以将方法转换为递归并使用regexp。这大大简化了代码

publicstaticstringremoveduplicates(stringstr){
如果(str.equals(str=str.replaceAll(“(..\\1”),“$1”))
返回str;
其他的
返回移除的副本(str);
}
publicstaticvoidmain(字符串[]args){
System.out.println(移除的副本(“aaaaaaaaaaa”);//a
System.out.p