我在主类中有这段代码
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个数组。如何处理这一问题并优化计算。谢谢你的帮助
发布于 2015-03-11 09:24:28
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,将使替换程序运行得更快。
发布于 2015-03-11 09:10:28
Java数组最大大小不受1000限制-请检查数组的lenght属性,它是int类型的。如果不检查规范,理论上是2^31-1 = 2147483647,即Integer.MAX_VALUE .因此,您不会在1000个元素之后达到最大大小--它在其他地方(内存?)
https://stackoverflow.com/questions/28982187
复制相似问题