回答:
次の引数ではなく、引数を取るオーバーロードをCharSequence
使用してみてください(例:)。String
char
str = str.replace("X", "");
CharSequence
です。docs.oracle.com/javase/7/docs/api/java/lang/...
X
char型の場合はどうしますか?
toString
最初にそれをする必要があると思います。したがって、コードは次のようになりますstr = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
使用する
public String replaceAll(String regex, String replacement)
動作します。
使用法になりますstr.replace("X", "");
。
実行中
"Xlakjsdf Xxx".replaceAll("X", "");
戻り値:
lakjsdf xx
replace
、単純なをとるオーバーロードがありますCharSequence
。
Java Stringsで何かしたい場合は、Commons Lang StringUtilsが最適です。
StringUtils.remove("TextX Xto modifyX", 'X');
replace
。
String test = "09-09-2012";
String arr [] = test.split("-");
String ans = "";
for(String t : arr)
ans+=t;
これは、文字列から文字を削除した例です。
こんにちは以下のこのコードを試してください
public class RemoveCharacter {
public static void main(String[] args){
String str = "MXy nameX iXs farXazX";
char x = 'X';
System.out.println(removeChr(str,x));
}
public static String removeChr(String str, char x){
StringBuilder strBuilder = new StringBuilder();
char[] rmString = str.toCharArray();
for(int i=0; i<rmString.length; i++){
if(rmString[i] == x){
} else {
strBuilder.append(rmString[i]);
}
}
return strBuilder.toString();
}
}
replaceの代わりにreplaceAllを使用します
str = str.replaceAll("X,"");
これはあなたに望ましい答えを与えるはずです。
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
package com.acn.demo.action;
public class RemoveCharFromString {
static String input = "";
public static void main(String[] args) {
input = "abadbbeb34erterb";
char token = 'b';
removeChar(token);
}
private static void removeChar(char token) {
// TODO Auto-generated method stub
System.out.println(input);
for (int i=0;i<input.length();i++) {
if (input.charAt(i) == token) {
input = input.replace(input.charAt(i), ' ');
System.out.println("MATCH FOUND");
}
input = input.replaceAll(" ", "");
System.out.println(input);
}
}
}
input = "deletes all blanks too";
「deletesalllankstoo」
これは文字列として渡されたすべての文字を削除するラムダ関数です
BiFunction<String,String,String> deleteChars = (fromString, chars) -> {
StringBuilder buf = new StringBuilder( fromString );
IntStream.range( 0, buf.length() ).forEach( i -> {
while( i < buf.length() && chars.indexOf( buf.charAt( i ) ) >= 0 )
buf.deleteCharAt( i );
} );
return( buf.toString() );
};
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
この解決策はreplace()
、文字を削除するときに、結果の文字列が–とは異なり–開始文字列よりも大きくなることはないことを考慮に入れています。そのため、文字どおりにStringBuilder
asに追加しながら、割り当てとコピーが繰り返されるのを回避replace()
します。
無意味なの世代は言うまでもありませんPattern
し、Matcher
内のインスタンスreplace()
を除去するために必要なことはありませんことを。このソリューションとは
異なりreplace()
、一度に複数の文字を削除できます。
str.replace("…", "")
インスタンス化private Pattern(…)
してから、生成されたパターンを呼び出しますpublic String replaceAll(String repl)
。したがって、次の関数呼び出しが発生しましたreturn Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
。– Sal_Vader_808コメントを参照してください。全体として、私の腰のラムダソリューションよりも約3倍長くなっています。そして、ここで、なぜ私のヒップのラムダソリューションもより高速なのかがうまく説明されています。なぜJavaのString :: replace()がとても遅いのですか?
現在選択されている回答が内部でコストのかかる正規表現操作を行うという懸念を確認するパフォーマンスベンチマークによる主な回答の評価
これまでに提供された回答は3つの主要なスタイルで提供されます(JavaScriptの回答を無視します;)):
コードサイズの面では、明らかにString.replaceが最も簡潔です。単純なJava実装は、Lambdaよりも少し小さくてきれい(IMHO)です(誤解しないでください。適切な場所でLambdaを頻繁に使用しています)。
実行速度は、単純なJava実装、Lambda、次にString.replace()(正規表現を呼び出す)の順でした。
これまでで最も高速な実装は、StringBuilderバッファーを可能な最大結果長に事前割り当てし、「削除する文字」文字列にない文字をバッファーに追加するように調整された単純なJava実装でした。これにより、長さが16文字を超える文字列(StringBuilderのデフォルトの割り当て)で発生する再割り当てが回避され、Lambda実装で発生する文字列のコピーから文字を削除するという「左にスライド」するパフォーマンスヒットが回避されます。
以下のコードは、単純なベンチマークテストを実行し、各実装を1,000,000回実行して、経過時間をログに記録します。
正確な結果は実行ごとに異なりますが、パフォーマンスの順序は決して変わりません。
Start simple Java implementation
Time: 157 ms
Start Lambda implementation
Time: 253 ms
Start String.replace implementation
Time: 634 ms
(カプランの回答からコピーされた)Lambdaの実装は、削除される文字の右側にあるすべての文字の「1つ左へのシフト」を実行するため、遅くなる可能性があります。これは明らかに、削除が必要な多くの文字を含む長い文字列の場合はさらに悪化します。また、Lambda実装自体にオーバーヘッドが発生する場合があります。
String.replace実装は、正規表現を使用し、呼び出しごとに正規表現の「コンパイル」を行います。これを最適化するには、正規表現を直接使用し、コンパイルされたパターンをキャッシュして、毎回コンパイルするコストを回避します。
package com.sample;
import java.util.function.BiFunction;
import java.util.stream.IntStream;
public class Main {
static public String deleteCharsSimple(String fromString, String charsToDelete)
{
StringBuilder buf = new StringBuilder(fromString.length()); // Preallocate to max possible result length
for(int i = 0; i < fromString.length(); i++)
if (charsToDelete.indexOf(fromString.charAt(i)) < 0)
buf.append(fromString.charAt(i)); // char not in chars to delete so add it
return buf.toString();
}
static public String deleteCharsLambda(String fromString1, String charsToDelete)
{
BiFunction<String, String, String> deleteChars = (fromString, chars) -> {
StringBuilder buf = new StringBuilder(fromString);
IntStream.range(0, buf.length()).forEach(i -> {
while (i < buf.length() && chars.indexOf(buf.charAt(i)) >= 0)
buf.deleteCharAt(i);
});
return (buf.toString());
};
return deleteChars.apply(fromString1, charsToDelete);
}
static public String deleteCharsReplace(String fromString, String charsToDelete)
{
return fromString.replace(charsToDelete, "");
}
public static void main(String[] args)
{
String str = "XXXTextX XXto modifyX";
String charsToDelete = "X"; // Should only be one char as per OP's requirement
long start, end;
System.out.println("Start simple");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsSimple(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
System.out.println("Start lambda");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsLambda(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
System.out.println("Start replace");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsReplace(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}
}
fromString.replace("X", "").replace("Y", "").replace("Z", "");
。これで正しいタイミングが得られます。単純な開始時間:759 | ラムダ時間の開始:1092 | deleteCharsLambda()の開始時間:1420 | 交換の開始時刻を修正:4636
置換の際に、角かっこ内に削除する必要がある文字を配置する必要があります。コード例は次のようになります。
String s = "$116.42".replaceAll("[$]", "");