替换大数组中的标记
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
将使替换 运行 更快。
我在主程序中有这段代码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
将使替换 运行 更快。