できるだけオーバーヘッドの少ないさまざまな入力文字列に同じ置換命令を数千回適用しようとしています。文字列内の複数の部分文字列を効率的に置き換える方法
- 検索文字列は、必ずしもすべて同じ長さではありません:私はこのために2つのものを検討する必要がある1つだけの「A」、もう一つは「CH」であるかもしれない、また別には、「SCH」であるかもしれないかもしれを
- すでに置き換えられたものは、もう一度置き換えられません。置換パターンが[a-> e; e-> a]の場合、 "beat"は "baet"または "beet"ではなく "baet"になります。念頭に置いて
、これは私が思い付いたコードです:ユーザー次第だろう
public class Replacements {
private String[] search;
private String[] replace;
Replacements(String[] s, String[] r)
{
if (s.length!=r.length) throw new IllegalArgumentException();
Map<String,String> map = new HashMap<String,String>();
for (int i=0;i<s.length;i++)
{
map.put(s[i], r[i]);
}
List<String> sortedKeys = new ArrayList(map.keySet());
Collections.sort(sortedKeys, new StringLengthComparator());
this.search = sortedKeys.toArray(new String[0]);
Stack<String> r2 = new Stack<>();
sortedKeys.stream().forEach((i) -> {
r2.push(map.get(i));
});
this.replace = r2.toArray(new String[0]);
}
public String replace(String input)
{
return replace(input,0);
}
private String replace(String input,int i)
{
String out = "";
List<String> parts = Arrays.asList(input.split(this.search[i],-1));
for (Iterator it = parts.iterator(); it.hasNext();)
{
String part = it.next().toString();
if (part.length()>0 && i<this.search.length-1) out += replace(part,i+1);
if (it.hasNext()) out += this.replace[i];
}
return out;
}
}
そして
String[] words;
//fill variable words
String[] s_input = "ou|u|c|ch|ce|ci".split("\\|",-1);
String[] r_input = "u|a|k|c|se|si".split("\\|",-1);
Replacements reps = new Replacements(s_input,r_input);
for (String word : words) {
System.out.println(reps.replace(word));
}
(s_input
とr_input
は、ので、彼らは」プログラムが実際に使用しないのと同じように、例だけを返します。
これはコードは長い検索文字列が最初に検索され、上記の2番目の条件もカバーするようにします。
ただし、非常に高価です。私がここでやっていることを達成する最も効率的な方法は何でしょうか(特にwords
の文字列の数がかなり多い場合)? (そうでない以外どうやら、;それは今、-1 split(p,-1)
で感謝しています)私の現在のコードで
は、「ソファ」「KUC」に変換されなければならない
あなたは 'split(" | ")'(引数は正規表現です)に問題があります。もし本当に必要なら 'split(" \\ | ")'を使うべきです。明示的に地図を作成し、それをパラメータとして「置換」に渡す方が良いでしょう。 –
'split(" | ")'部分は 's_input'と' r_input'の中に何があるのかを説明するだけです。実際のコードは、その内容を別々に導出します。しかし、私はそれを排除するためにここでコードを編集します。 – joelproko
あなたができるだけオーバーヘッドを小さくしたいのであれば、理想的な解決方法はchar配列を繰り返し(1回)し、複数のcharを置き換える何らかの置換のための履歴を追跡することでしょう。別名正規表現をディッチします。 – Rogue