替换大型阵列中的令牌

时间:2015-03-11 08:58:44

标签: java arrays replace token

我在主类中有这段代码

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

并且有这个> slangDictionary类中的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个第一个数组。如何处理这个并优化计算。谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

Java数组最大大小不受1000限制 - 检查数组的lenght属性,它是int类型。在没有检查规范的情况下,理论上它是2 ^ 31-1 = 2147483647,即Integer.MAX_VALUE。所以,你不会在1000个元素之后达到最大尺寸 - 它在其他地方(记忆?)

答案 1 :(得分:0)

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

第一个问题是您使用了错误的数据结构。这不是数组的用途。您希望将某些字符串映射到其他字符串,因此您应该使用映射。您的replacements应为Map<String, String>类型,具体使用HashMap实施。您可以使用静态初始化程序填充地图 - 在您的班级中,例如

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将使替换运行得更快。