替换大数组中的标记

Replace tokens in large array

我在主程序中有这段代码class

String slangOutput = msglower;
                    for (String[] replacement : sd.replacements){
                        if (slangOutput.length() == replacement[0].length()){
                            slangOutput = slangOutput.replace(replacement[0], replacement[1]);
                        }
                    }

并在 slangDictionary class:

中包含 > 5000 个数组
String [][] replacements ={
            {"*4u","kiss for you"},
            {"*67"," unknown"},
            {"*eg*","evil grin"},
            {"07734","hello"},
            {"0day","software illegally obtained before it was released"},
            {"0noe","oh no"},
......

我很确定 java 的数组大小有限,当我 运行 这段代码时,它只会替换第一个数组的 1000 个。如何处理这个问题并优化计算。感谢帮助

Java 数组最大大小不受 1000 的限制 - 检查数组的长度 属性,它是 int 类型。不查规范,理论上是2^31-1 = 2147483647,也就是Integer.MAX_VALUE。因此,您不会在 1000 个元素后达到最大尺寸 - 它在其他地方(内存?)

Java 数组的大小不受限制,除非您达到大约 Integer.MAX_VALUE。那不是问题。

第一个问题是您使用了错误的数据结构。这不是数组的用途。您想要将一些字符串映射到其他字符串,所以这正是您应该使用映射的情况。您的 replacements 应该是 Map<String, String> 类型,特别是使用 HashMap 实现。您可以使用静态初始值设定项填充地图 - 在您的 class 中,类似于

private static Map<String, String> replacements;
static {
   replacements = new HashMap<String, String>();
   replacements.put("*4u", "kiss for you");
   .....
}

然后,字符串的replace方法不是很快。当您需要在不使用太多代码的情况下进行一些替换时,这很好,但如果您在循环中使用它数千次,那真的很糟糕。加快速度的一种方法是使用 StringBuilder

StringBuilder sb = new StringBuilder(msglower);
for (Entry<String, String> replacement : replacements.entrySet()) {
  int start = sb.indexOf(replacement.geyKey(), 0);
  while (start >= 0) {
    int end = start + replacement.getKey().length();
    sb.replace(start, end, replacement.getValue());
    start = sb.indexOf(replacement.getKey(), start + replacement.getValue().length());
  }
}

上面的我没试过编译,不过应该是思路正确。并且以这种方式使用 StringBuilder 将使替换 运行 更快。