画像に置き換える必要がある特定のマーカーを含む一連の文字列があります。最初に、マーカーと画像を使用してハッシュ マップを作成しました。
Map<String, String> images = new HashMap<String, String>();
images.put(":img:howdy:", "path/images/hello.png");
images.put(":img:code:", "path/images/code.png");
images.put(":img:smile:", "path/images/sm.png");
//...and 70 more records
文字列は次のようになります。
これは文字列です :img:howdy: ですね :img:smile:
さらに:img:smile:
これは images:img:code::img:smile の文字列です:
解析後、すべてのマーカーは画像に置き換えられる予定です。
私は次の点で立ち往生しました:
Map<String, String> images = new HashMap<String, String>();
images.put(":img:howdy:", "path/images/hello.png");
images.put(":img:code:", "path/images/code.png");
images.put(":img:smile:", "path/images/sm.png");
String[] strings = {"This is a string :img:howdy:, you know it :img:smile:",
"And even more:img:smile:",
"This is a string with images:img:code::img:smile:"};
for (String text : images.keySet()) {
for (String string : strings) {
if(string.contains(text)) {
string.replace(text, images.get(text));
}
}
}
まず、マーカーが置き換えられますが、反復が多すぎます。第 2 に、たとえば StringBuilder を使用すると、いくつかのマーカーが置き換えられ、いくつかのマーカーが置き換えられずに多くの重複が発生します。
私は文字列の解析とそれに対応するアルゴリズムに (現時点では) 強くないので、選択したアプローチを見た後で石を投げつけないでください。
Dariusz Waver が提案したように少し作り直して追加しまし た。ここに私が持っているものがあります:
private final String IMAGE_PATTERN = ":s:\\w+:";
//.......
Pattern p = Pattern.compile(IMAGE_PATTERN);
Matcher m = p.matcher(message);
while(m.find())
{
String imgPattern = message.substring(m.start(), m.end());
String imgPath = ImgPaths.images.get(imgPattern);
//If there's no such image in Images Map
if(imgPattern != null) {
message = message.replace(imgPattern, imgPath);
m.reset(message);
}
}
StringBuilder result = new StringBuilder();
result.append(timestamp).append(" - ").append(sender)
.append(": ").append(message);
非常に膨大な量のテキストがあることを考慮して、より最適化する方法はありますか?