如何删除 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 ) ;
警告:此代码未经测试,只是草稿。
我应该写一个函数来排除句子 (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 ) ;
警告:此代码未经测试,只是草稿。