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

时间:2018-02-14 03:42:13

标签: java string

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

对于我做错的任何建议都将不胜感激。 谢谢,

public String DuplicatesTEST(String s){
StringBuilder result = new StringBuilder();
for (int i = 1; i <= s.length(); i++){
    char curr = s.charAt(i);
    char prev = s.charAt(0);
    if (curr != prev ) {result.append(prev);} 
    else if (curr == prev) 
    prev = curr;        }

return result.toString();  
}

4 个答案:

答案 0 :(得分:2)

数据结构的行为'Set'不包含重复项,因此请使用Set删除重复项 尝试这样的事情:

  public String DuplicatesTEST(String s) {
    StringBuilder result = new StringBuilder();
    if(s != null && !s.isEmpty()) {
      char first = s.charAt(0);
      for (int i = 1; i < s.length(); i++) {
        if(first != s.charAt(i)){
          result.append(first);
          first = s.charAt(i);
        }
      }
      result.append(first);
    }
    return result.toString();
  }

为“fffggghhhff”输入此返回“fgh”

如果你想删除上面有一个块的重复项,那么我对你的实现做了一些小改动

time.sleep

为“fffggghhhff”输入此返回“fghf”

答案 1 :(得分:1)

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

Try it online!

public static String removeDuplicates(String str) {
    if (str.equals(str = str.replaceAll("(.)\\1", "$1")))
        return str;
    else
        return removeDuplicates(str);
}
public static void main(String[] args) {
    System.out.println(removeDuplicates("aaaaaaa"));     // a
    System.out.println(removeDuplicates("fffggghhh"));   // fgh
    System.out.println(removeDuplicates("fffggghhhff")); // fghf
}

说明:

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

另见:Remove a pair of chars in a string next to each other

答案 2 :(得分:0)

字符串是基于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();
}

答案 3 :(得分:-1)

public static void main(String[] args) {
    System.out.println(DuplicatesTEST("ffggghhh"));
}

public static String DuplicatesTEST(String s) {
    StringBuilder result = new StringBuilder();
    Character curr = null;
    for (int i = 1; i <= s.length(); i++) {
        char prev = s.charAt(i-1);
        if (curr == null || prev != curr.charValue()){
            result.append(prev);
            curr = prev;
        }                    
    }
    return result.toString();
}