文字列から単語を置き換えたいのですが、同じように機能しますがstring.replace("word", "different word");
、回数は限られています。単語がapple
文字列で 10 回言及されているとしましょう。?apples
oranges
また、できればランダムにしたいので、1位から5位までは飛ばさずにapple
飛ばして、例えば変更する1st, 3rd, 4th, 7th, and 8th apple
と変化します。
ありがとう!
私はランダムな部分文字列を作成replaceFirst
し、それらに対してメソッドを使用します。部分文字列化の場合、 substring(int beginIndex)を使用して、0 から lengthOfOriginalWord-1-lengthOfWordToReplace 間隔のランダムな開始インデックスを指定します。
try {
String originalWord = "alabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaORANGEalabalaORANGEORANGEaaaaaaa";
String replacedWord = "ORANGE";
String replacingWord = "APPLE";
String substringedWord = "";
// make sure this is smaller or equal with the number of occurrences, otherwise it's endless loop times
int numberOfReplaces = 3;
Random ran = new Random();
int beginIndex;
while (numberOfReplaces > 0) {
// random index between 0 and originalWord.length()-1-replacedWord.length()
beginIndex = ran.nextInt(originalWord.length()-1-replacedWord.length());
substringedWord = originalWord.substring(beginIndex);
if (substringedWord.contains(replacedWord)) {
originalWord = originalWord.substring(0, beginIndex) + substringedWord.replaceFirst(replacedWord, replacingWord);
numberOfReplaces--;
}
}
System.out.println(originalWord);
} catch (Exception exc) {
System.err.println("An error occurred: \n" + exc);
}
5回実行した後の出力は次のとおりです。
alabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaAPPLEalabalaAPPLEAPPLEaaaaaaa
alabalaportocalaAPPLEalabalaportocalaAPPLEalabalaportocalaAPPLEalabalaportocalaORANGEalabalaORANGEORANGEaaaaaaa
alabalaportocalaAPPLEalabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaAPPLEalabalaAPPLEORANGEaaaaaaa
alabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaORANGEalabalaportocalaAPPLEalabalaAPPLEAPPLEaaaaaaa
alabalaportocalaAPPLEalabalaportocalaORANGEalabalaportocalaAPPLEalabalaportocalaAPPLEalabalaORANGEORANGEaaaaaaa
繰り返し使用String#indexOf(String str, int fromIndex)
して、置換する単語の開始インデックスをすべて見つけてから、それらのインデックスのいくつかをランダムに選択し (たとえば、 shuffled を使用するArrayList<Integer>
か、alternativelyArrayList<Integer>#remove(Random#nextInt(ArrayList#size))
を使用して)、連結された呼び出しを使用して新しい文字列を構築できます。String#substring(int beginIndex, int endIndex)
ArrayList<Integer> indices = new ArrayList<>();
int fromIndex = str.indexOf(searchString);
while(fromIndex != -1) {
indices.add(fromIndex);
fromIndex = str.indexOf(searchString, fromIndex + 1);
}