Java, Заменяющий несколько другая подстрока в строке сразу (или самым эффективным способом)

После некоторого исследования похоже, что лучший подход должен был бы просто указать пользовательскую строку агента пользователя при совершении вызовов Ajax и затем проверке на эту пользовательскую строку агента пользователя на сервере.

90
задан Brian Agnew 25 August 2009 в 07:57
поделиться

4 ответа

Если строка, с которой вы работаете, очень длинная или вы работаете со многими строками, то может быть целесообразно использовать java.util.regex.Matcher (это требует времени заранее для компиляции, поэтому он не будет эффективным, если ваш ввод очень мал или ваш шаблон поиска часто меняется).

Ниже приведен полный пример, основанный на списке токенов, взятых с карты. (Использует StringUtils из Apache Commons Lang.)

Map<String,String> tokens = new HashMap<String,String>();
tokens.put("cat", "Garfield");
tokens.put("beverage", "coffee");

String template = "%cat% really needs some %beverage%.";

// Create pattern of the format "%(cat|beverage)%"
String patternString = "%(" + StringUtils.join(tokens.keySet(), "|") + ")%";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);

StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);

System.out.println(sb.toString());

После компиляции регулярного выражения сканирование входной строки обычно выполняется очень быстро (хотя, если ваше регулярное выражение является сложным или включает в себя отслеживание с возвратом, вам все равно потребуется выполнить тест, чтобы подтвердить это !)

97
ответ дан 24 November 2019 в 07:02
поделиться

StringBuilder будет выполнять замену более эффективно, так как его буфер массива символов может быть указан до необходимой длины. StringBuilder предназначен не только для добавления!

Конечно, реальный вопрос в том, не заходит ли это оптимизация слишком далеко? JVM очень хорошо справляется с созданием нескольких объектов и последующей сборкой мусора, и, как и все вопросы оптимизации, мой первый вопрос заключается в том, измерили ли вы это и определили ли вы, что это проблема.

4
ответ дан 24 November 2019 в 07:02
поделиться

Как насчет использования метода replaceAll () ?

2
ответ дан 24 November 2019 в 07:02
поделиться

Если вы собираетесь менять String много раз, то обычно более эффективно использовать StringBuilder (но измерьте свою производительность, чтобы узнать) :

String str = "The rain in Spain falls mainly on the plain";
StringBuilder sb = new StringBuilder(str);
// do your replacing in sb - although you'll find this trickier than simply using String
String newStr = sb.toString();

Каждый раз, когда вы заменяете строку, создается новый объект String, потому что строки неизменяемы. StringBuilder является изменяемым, то есть его можно изменять сколько угодно.

7
ответ дан 24 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: