比较数组项,索引越界

Comparing array items, index out of bound

我有一段代码,我对如何处理我的问题有点困惑,所以请查看下面的方法。我试图寻找解决方案,但不幸的是 none 符合我的需要,所以我在这里寻找建议。该方法采用字符串并删除重复的字符,例如 - 输入:ABBCDEF 应该 return ABCDEF,但是在最后一次迭代中输入 i+1 时,我得到了 IndexOutOfBound 异常,所以我可以迭代直到 string.length -1 但后来我松开了最后一个元素,您认为什么是最聪明的解决方案,谢谢。

public String removeDuplicates(String source){
        if(source.length() < 2){
            return source;
        }

        StringBuilder noDuplicates = new StringBuilder();
        char[] string = source.toCharArray();

        for(int i = 0; i < string.length-1; i++){
            if(string[i] != string[i+1]){
                noDuplicates.append(string[i]);
            }
        }
        return noDuplicates.toString();
    }

您可以简单地在循环后附加最后一个字符:

public String removeDuplicates(String source){

    ...

    noDuplicates.append(string[string.length - 1]);
    return noDuplicates.toString();
}

您可以这样做:追加 source 中的第一个字符,然后仅追加不等于先前追加的字符的后续字符。

if (source.isEmpty()) {
  return source; // Or "", it doesn't really matter.
}
StringBuilder sb = new StringBuilder();
sb.append(source.charAt(0));
for (int i = 1; i < source.length(); ++i) {
  char c = source.charAt(i);
  if (c != sb.charAt(sb.length() - 1)) {
    sb.append(c);
  }
}
return sb.toString();

但是如果你想更简洁地做到这一点,你可以用正则表达式来做到这一点:

return source.replaceAll("(.)\1+", "");

你有一个简单的逻辑错误: 你把你的字符串变成一个字符数组。 很好,但是任何数组的长度 属性 都会显示 人类计算是否有东西的方法。

如果有 1 个元素,则长度将为 1
2 -> 2
3 -> 3
等等
你明白了。

因此,当您使用 string[i + 1] 时,您将使用一个字符。 您可以将中止条件更改为

i < = string.length - 2

或者您可以编写一个字符串迭代器,以便能够访问下一个元素,但是 对于这个例子来说这似乎有点矫枉过正

如果您希望删除所有重复字符,无论它们在给定 String 中的位置如何,您可能需要考虑使用 chars() 方法,该方法提供 IntStream 个字符和具有 distinct() 方法来过滤掉重复值。然后你可以像这样用 StringBuilder 把它们放回去:

public class RemoveDuplicatesTest {
  public static void main(String[] args) {
    String value = "ABBCDEFE";
    System.out.println("No Duplicates: " + removeDuplicates(value));
  }
  
  public static String removeDuplicates(String value) {
    StringBuilder result = new StringBuilder();
    value.chars().distinct().forEach(c -> result.append((char) c));
    return result.toString();
  }
}

这正是 LinkedHashSet was made for! Under the hood it's a HashSet 使用迭代器跟踪插入顺序的原因,因此您可以通过添加到集合中来删除重复项,然后重建具有保证顺序的字符串。

public static String removeDuplicates(String source) {
    Set<String> dupeSet = new LinkedHashSet<>();

    for (Character v : source.toCharArray()) {
        dupeSet.add(v.toString());
    }

    return String.join("", dupeSet);
}