比较数组项,索引越界
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);
}
我有一段代码,我对如何处理我的问题有点困惑,所以请查看下面的方法。我试图寻找解决方案,但不幸的是 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);
}