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

Posted

技术标签:

【中文标题】如何在java中删除字符串的某些字母的所有字符【英文标题】:How to remove all chars of certain letters of a String in java 【发布时间】:2022-01-05 06:23:52 【问题描述】:

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

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!

【问题讨论】:

旁白:使用像StringBuilder 这样的可变类会更有效率,也可能更容易。 docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/… 【参考方案1】:

这是使用正则表达式的一种方式。它只是用空字符串替换字符类[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!    

【讨论】:

嗯,这实际上是一个很好的解决方案!但是为此,两个功能中的第一个将变得多余 @DaveTwickenham 这是真的。由于您没有将它们指定为要求,因此我认为排除它们并不重要。【参考方案2】:

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

添加一个while 循环,如果text.indexOf(c) 返回-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;
    

【讨论】:

如何编码? int i1 = text.indexOf(c); String result = ""; while (text.indexOf(c) &gt;= 0) result = text.substring(0, i1) + text.substring(i1+1); return result; 这样我在控制台中什么也没有打印出来。 removeChar 函数中,您应该使用result 而不是text 作为输入字符串。我自己尝试过——在这些情况下添加调试打印很有帮助。我在答案中添加了示例代码。希望这会有所帮助。 Thx,是的,您的代码在理论上有效,因为我得到了正确的结果,但在此之前我得到了很多额外的代码。顺便说一句,我删除了第 5 行,因为这有助于从控制台中减少不需要的代码。 This text my be readable without vowels! This text my be redable without vowels! This text my be redble without vowels! This txt my be redble without vowels! This txt my b redble without vowels! 等等......它会打印出它的每一步。我怎样才能避免这种情况,以便我们只得到最后一句话?编辑:没关系,我修好了!【参考方案3】:

带有循环的“经典”变体:

    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();
    

【讨论】:

【参考方案4】:

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

选项 1:

您可以使用chars()stream 文本,然后使用.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:

您可以使用chars()stream 的字母,然后使用.reduce()charstext 中删除:

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!

【讨论】:

str.replaceAll(c, "") 调用时,您将始终重新创建字符串。这不好。 @0xDEADBEEF 我添加了没有.reduce()的第二种方法。【参考方案5】:

避免char

其他答案使用自 Java 2 以来一直存在的 char/Character 类型。作为 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 ) ;

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

【讨论】:

以上是关于如何在java中删除字符串的某些字母的所有字符的主要内容,如果未能解决你的问题,请参考以下文章

Netezza 和 Regexp:如何从字符串中删除所有非字母

java 如何删除一个字符串中出现次数最少的字符。比如addffdf 输出 ddffdf

js如何去掉字符串中的某串字符

如何删除所有不以某些字符开头的行?

如何从 Python 的数据框列中的字符串中删除非字母数字字符?

Python,从字符串中删除所有非字母字符