Мне нужен быстрый алгоритм замены ключа для Java - PullRequest
2 голосов
/ 21 января 2009

Учитывая строку с ключами замены, как я могу наиболее эффективно заменить эти ключи значениями времени выполнения, используя Java ? Мне нужно делать это часто, быстро и на достаточно длинных строках (скажем, в среднем, 1-2 КБ). Форма ключей - мой выбор, так как здесь я также предоставляю шаблоны.

Вот пример (пожалуйста, не зацикливайтесь на том, что это XML; я хочу сделать это, если возможно, дешевле, чем с помощью операций XSL или DOM). Я хотел бы заменить все @[^@]*?@ шаблоны в этом на значения свойств из свойств бина, истинных Property свойств и некоторых других источников. Ключ здесь fast . Есть идеи?

<?xml version="1.0" encoding="utf-8"?>

<envelope version="2.3">

  <delivery_instructions>

    <delivery_channel>
      <channel_type>@CHANNEL_TYPE@</channel_type>
    </delivery_channel>

    <delivery_envelope>
      <chan_delivery_envelope>
    <queue_name>@ADDRESS@</queue_name>
      </chan_delivery_envelope>
    </delivery_envelope>

  </delivery_instructions>

  <composition_instructions>
    <mime_part content_type="application/xml">
      <content><external_uri>@URI@</external_uri></content>
    </mime_part>
  </composition_instructions>

</envelope>

Наивной реализацией является использование String.replaceAll(), но я не могу не думать, что это не идеально. Если мне удастся избежать добавления новых сторонних зависимостей, тем лучше.

Ответы [ 13 ]

0 голосов
/ 21 января 2009

Я бы не был уверен, что принятый ответ быстрее, чем String.replaceAll (String, String). Здесь для сравнения приведена реализация String.replaceAll и Matcher.replaceAll, которая используется под обложками. выглядит очень похоже на то, что ищет OP, и я предполагаю, что он, вероятно, более оптимизирован, чем это упрощенное решение.

public String replaceAll(String s, String s1)
    {
        return Pattern.compile(s).matcher(this).replaceAll(s1);
    }

public String replaceAll(String s)
    {
        reset();
        boolean flag = find();
        if(flag)
        {
            StringBuffer stringbuffer = new StringBuffer();
            boolean flag1;
            do
            {
                appendReplacement(stringbuffer, s);
                flag1 = find();
            } while(flag1);
            appendTail(stringbuffer);
            return stringbuffer.toString();
        } else
        {
            return text.toString();
        }
    }
0 голосов
/ 21 января 2009

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

0 голосов
/ 21 января 2009

У меня также есть библиотека подстановок, не основанная на регулярных выражениях, доступная здесь . Я не проверял его скорость, и он напрямую не поддерживает синтаксис в вашем примере. Но было бы легко расширить поддержку этого синтаксиса; см., например, этот класс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...