java - 从字符串中删除字符的所有匹配对

标签 java string

我正在尝试编写一个删除重复字符的代码。例如 - 如果我们有一个字符串 "aabacdc",我们希望将其设置为 "abd"。如果该字符在字符串中出现两次,那么我们将像上例中那样删除这两个字符。 'a' 在我们的字符串中出现了 3 次,因此我们只删除了 2 个 a 并留下了 1 个。

我在这段代码中尝试做的是使用两个嵌套的 for 循环 - 第一个 for 循环将第一个字符与其他字符进行比较。如果该字符在字符串中重复,则只需删除这两个字符即可。我该如何修复此代码?

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String str2 = input.nextLine();

    StringBuilder str = new StringBuilder(str2);

    for (int k = 0; k < str.length() - 1; k++) {
        for (int i = 1; i < str.length() - 1; i++) {
            if (str.charAt(k) == str.charAt(i)) {
                str.deleteCharAt(k);
                str.deleteCharAt(i);
            } 
        }
    }

    System.out.println(str);
}

最佳答案

根据您的预期输出,我对您尝试执行的操作的解释是您希望一次从字符串中删除一对字符。因此,如果字符串中有奇数个字符,则应保留 1,如果有偶数个字符,则应保留 0。

每当您在按索引迭代时从结构中删除元素时,都需要向后循环该结构,以便在删除元素时索引值不会发生变化。这意味着您应该只删除外循环当前所在或已经看到的元素(即只删除索引 >= i 处的元素)。

Scanner input = new Scanner(System.in);
String str = input.nextLine();
StringBuilder sb = new StringBuilder(str);

for (int i = sb.length() - 2; i >= 0; i--) {
    for (int j = i + 1; j < sb.length(); j++) {
        if (sb.charAt(i) == sb.charAt(j)) {
            sb.deleteCharAt(j);
            sb.deleteCharAt(i);
            break;
        }
    }
}

System.out.println(sb);

Ideone Demo

关于java - 从字符串中删除字符的所有匹配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036685/

相关文章:

java - 在哨兵不工作时做(java)

Java:分割逗号分隔的字符串但忽略引号中的逗号

java - 无法从 Eclipse 使用 Maven 运行 Java 应用程序,但它可以在命令行中运行

java - 使用 javac 1.8 的字符串连接性能比 Eclipse 编译器更好?

c++ - 当字符串包含一个值时,为什么 string.empty() 的计算结果为真?

c++ - 读取包括空字节在内的所有字符

arrays - 如何从 Swift 中的段落中获取一组单词?

c++ - std::find_last_of 实际上是如何工作的?

java - 如何通过 it 属性为枚举设置一些值

java - 如何使用 Spring boot 配置受信任的 SSL keystore ?