我有一個串列或一個字串陣列
String [] elements = {"cat", "dog", "fish"};
和一個字串
String str = "This is a caterpillar and that is a dogger.";
如果字串中存在任何陣列/串列,我想從字串中洗掉陣列/串列的所有專案。這樣函式應該回傳一個字串
str = "This is a erpillar and that is a ger." (cat and dog removed from the string)
我可以做這樣的事情
private String removeElementsFromString (String str, String [] elements) {
if(Arrays.stream(elements).anyMatch(str::contains)){
for(String item : elements){
str = str.replace(item, "");
}
}
return str;
}
但是將 for 回圈更改為其他內容的優雅方式是什么。
uj5u.com熱心網友回復:
StringBuilder 的另一個解決方案:
因為它更快并且消耗更少的記憶體。
我認為在這里使用 StringBuilder 而不是 String 更合適:
import java.io.IOException;
import java.util.stream.Stream;
public class Bounder {
public static void main(String[] args) throws IOException {
String[] elements = { "cat", "dog", "fish" };
String str = "This is a catcatcatcatcatcatcaterpillar ancatcatcatcatd thcatcatcatat is a dogdogdogdogdogdogger.";
// Use StringBuilder here instead of String
StringBuilder bf = new StringBuilder(str);
str =null;
System.out.println("Original String = " bf.toString());
Stream.of(elements).forEach(e -> {
int index = bf.indexOf(e);
while (index != -1) {
index = bf.indexOf(e);
if (index != -1) {
bf.delete(index, index e.length());
}
}
});
System.out.println("Result = " bf.toString());
}
}
輸出 :
Original String = This is a catcatcatcatcatcatcaterpillar ancatcatcatcatd thcatcatcatat is a dogdogdogdogdogdogger.
Result = This is a erpillar and that is a ger.
uj5u.com熱心網友回復:
單線解決方案
以下單行程式可以完成這項作業:
str = str.replaceAll(Arrays.stream(elements).map(s -> "(?:" s ")").collect(Collectors.joining("|")), "");
演示:
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
String[] elements = { "cat", "dog", "fish" };
String str = "This is a caterpillar and that is a dogger.";
str = str.replaceAll(Arrays.stream(elements).map(s -> "(?:" s ")").collect(Collectors.joining("|")), "");
System.out.println(str);
}
}
輸出:
This is a erpillar and that is a ger.
ONLINE DEMO
解釋:
Arrays.stream(elements).map(s -> "(?:" s ")").collect(Collectors.joining("|"))結果轉換成正則運算式,(?:cat)|(?:dog)|(?:fish)其中的裝置 cat或dog或fish。
下一步是將生成的正則運算式替換為"".
uj5u.com熱心網友回復:
我會簡單地使用:
private String removeElementsFromString(String str, String[] elements) {
for (String item : elements) {
str = str.replace(item, "");
}
return str;
}
我沒有看到第一個條件的任何優勢:
if(Arrays.stream(elements).anyMatch(str::contains)) {
uj5u.com熱心網友回復:
最簡潔的方法是使用replaceAll,它接受一個正則運算式作為第一個引數:
String newStr = str.replaceAll(String.join("|", elements), "");
這只有效,因為里面的東西elements沒有特殊的正則運算式字符。如果他們中的任何一個這樣做了(或者他們有機會這樣做了),你必須參考它們:
String pattern = Arrays.stream(elements).map(Pattern::quote).collect(Collectors.joining("|"));
但是請注意,這將在單次通過中運行。所以如果你有一個像這樣的字串:
docatg
這種方法會導致dog,而這樣做的方法input.replace("cat", "").replace("dog", "")也會洗掉dog。
uj5u.com熱心網友回復:
Arrays.stream(elements).reduce(str, (r, w) -> r.replace(w, ""))
與預期的輸出。
如果要減少輸入字串直到不再可能,最好迭代直到沒有變化
String n = str, o = null;
do {
n = stream(elements).reduce(o = n, (r, w) -> r.replace(w, ""));
} while(!n.equals(o));
System.out.println(n);
然后,輸入字串
This is a caterpillar and that is a docatg.
你會得到
This is a erpillar and that is a .
uj5u.com熱心網友回復:
你可以這樣做。只需使用一個簡單的回圈。
for (String word : elements) {
str = str.replace(word,"");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317666.html
上一篇:合并串列中的重疊字串序列
