0

首先,我需要这样做的原因是Apache 的 Commons StringUtils方法中的 API:

StringUtils.replaceEach(String text, String[] searchList, String[] replacementList) 

我想要做的是用实际的特殊字符替换所有 HTML 特殊字符编码,这意味着searchListandreplacementList数组将非常大。我怎样才能以一种易于阅读和维护的方式做到这一点?

是的,我可以创建两个数组,但如果我这样做,那么很容易出错。我怎么知道我没有错过特殊编码,我有正确的位置等。我更希望编码和字符并排的代码以避免任何错误。我看了 aHashMap但是你只能获取键(编码)并且必须循环获取字符值,这不是很高效,特别是如果它要运行很多。对于必须拆分每次运行的二维数组也是如此。

4

2 回答 2

2

你的目标是什么类型的性能?如果您正在寻找替换 HTML 特殊字符,您是否可以不缓存将编码的 HashMap 拆分为特殊字符的结果在两个静态最终变量中?这仍然需要您承担处理 HashMap 的开销,但保存结果会阻止您在每次调用时运行该过程。像这样的东西:

import java.util.HashMap;
import java.util.Map;

class MyStringReplaceCLass {
  private static final String[] encodings;
  private static final String[] specialCharacters;

  static {
      HashMap<String, String> characterEncoding = new HashMap<String, String>();
      characterEncoding.put("...", "...");
      characterEncoding.put("...", "...");

      // Put other encodings here as necessary

      encodings = new String[characterEncoding.size()];
      specialCharacters = new String[characterEncoding.size()];

      Map.Entry<String, String>[] entries = characterEncoding.entrySet();

      for (int i = 0; i < entries.length; i++) {
          encodings[i] = entries[i].getKey();
          specialCharacters[i] = entries[i].getValue();
      }
  }

  public String replaceEachEncoding(String text) {
      return StringUtils.replaceEach(String text, String[] searchList, String[] replacementList);
  }
}

从这里,您可以致电

MyStringReplaceClass.replaceEachEncoding(myText)

我不完全确定这是否完全符合您的要求,但我觉得某种带有光处理的地图将是最干净的解决方案。

于 2016-07-10T20:18:07.727 回答
-1

假设文本长度为 N,特殊字符数量为 M,searchList 长度为 K。使用 HashMap,比较次数=N*K,交换次数 M。

为了性能,1. 您可以为您的搜索/替换列表创建一个标签。然后扫描文本并标记每个条目(记录索引)。N 比较。2. 现在你有 M 个索引可以用 K 个可能的字符替换。比较 = M K。交换 M。比较 N + M K < N*K。交易所 M

希望能帮助到你!

于 2016-07-09T22:48:36.050 回答