如何删除 java 中字符串的某些字母的所有字符

How to remove all chars of certain letters of a String in java

我应该写一个函数来排除句子 (String) 的某些字母 (char)。我基本上也是这样做的,但问题是我只设法删掉了句子中字母的第一次出现。

public static void main (String[] args) {
        String text = "This text may be readable without vowels!";
        String letters = "aeiou";
        Out.println(removeLetters(text, letters));
}
public static String removeLetters(String text, String letters) {
    char c = 'f';
    String remover = text;
    for (int i=0; i<letters.length(); i++) {
        c = letters.charAt(i);
        remover = removeChar(remover, c);
    }
    return remover;
}
public static String removeChar(String text, char c) {
    int i1 = text.indexOf(c);
    String result = text.substring(0, i1) + text.substring(i1+1);
    return result;
}

我需要如何更改最后一个函数 removeChar 才能剪切出一个字母的所有外观?找到所有索引可能并不难,但真正的困难在于之后将子字符串放在一起,这样你仍然只剩下一个句子,只是没有某些字母。因为如果我理解正确的话,你拥有的索引越多,你需要加在一起的不同子串就越多。

目前我明白了。

Ths txt my be readable witht vowels!

目标是到达这里:

Ths txt my b rdbl witht vwls!

我的建议是在 removeChar 函数中使用一个循环。

添加一个 while 循环,如果 text.indexOf(c) returns -1(这意味着该字符串不再包含您正在搜索的字母),该循环将中断。

这样您将找到要从源字符串中删除的每个字母的所有出现。

removeChar 函数的示例代码:

    public static String removeChar(String text, char c) {
        String result = text;
        int i1 = text.indexOf(c);
        while (i1 != -1) {
            System.out.println("Index of " + c + " in " + result + " is: " + i1);
            String part1 = result.substring(0, i1);
            System.out.println(part1);
            String part2 = result.substring(i1+1);
            System.out.println(part2);
            result = part1 + part2;
            i1 = result.indexOf(c);
        }
        return result;
    }

这里有两种使用 streams 的方法:

选项 1:

您可以 stream 使用 chars() 的文本,然后 .filter() 字母:

public static String removeLetters(String text, String letters) {
    return text.chars().filter(c -> letters.indexOf(c) == -1)
            .mapToObj(Character::toString).collect(Collectors.joining());
}

选项2:

您可以 stream 使用 chars() 的字母,然后使用 .reduce()text:

中删除 chars
public static String removeLetters(String text, String letters) {
    return letters.chars().mapToObj(Character::toString)
            .reduce(text, (str, c) -> str.replaceAll(c, ""));
}

然后:

String text = "This text may be readable without vowels!";
String letters = "aeiou";
System.out.println(removeLetters(text, letters));

输出:

Ths txt my b rdbl wtht vwls!

这里是一种使用正则表达式的方法。它只是将字符 class [aeiou] 中的每个元音替换为空字符串。

String text = "This text may be readable without vowels!";
text = text.replaceAll("[aeiou]","");
System.out.println(text);

打印

Ths txt my b rdbl wtht vwls!    

带循环的“经典”变体:

    public static String removeLetters(String text, String strLetters) {
        Set<Character> letters = new HashSet<>();
        for (char i : strLetters.toCharArray()) {
            letters.add(i);
        }

        StringBuilder sb = new StringBuilder();
        for (char i : text.toCharArray()) {
            if (!letters.contains(i)) sb.append(i);
        }
        return sb.toString();
    }

避免char

其他答案使用 char/Character 类型,自 Java 以来一直是遗留类型 2. 作为 16 位值,char 在物理上无法表示大多数字符。

使用代码点

相反,学习使用代码点整数。 Unicode 定义的 140,000 多个字符中的每一个都被永久分配了一个代码点编号。

List< Integer > vowelCodePoints = List.of( "aeiou".codePoints().toArray() ) ;

获取分配给输入字符串中每个字符的代码点的 IntStream

IntStream codePoints = input.codePoints() ;

过滤掉在您的元音代码点集合中找不到的字符的代码点。

int[] filteredCodePoints = codePoints.filter( codePoint -> ! vowelCodePoints.contains( codePoint ) ).toArray() ;

从该代码点整数数组中生成 String。请参阅问题,Generate a String object from a List of code point integers?

String result = new String( filteredCodePoints , 0 , filteredCodePoints.length ) ;

警告:此代码未经测试,只是草稿。