Java 在大数组中替换令牌
我在主类中有这个代码Java 在大数组中替换令牌,java,arrays,replace,token,Java,Arrays,Replace,Token,我在主类中有这个代码 String slangOutput = msglower; for (String[] replacement : sd.replacements){ if (slangOutput.length() == replacement[0].length()){ slangOutput = slangOutput.replace(re
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个数组。如何处理此问题并优化计算。感谢您的帮助Java数组的最大大小不受1000的限制-请检查数组的Length属性,它是int类型的。如果不检查规格,理论上它是2^31-1=2147483647,这是Integer.MAX_值。因此,在1000个元素之后,您将不会达到最大大小-它在其他地方(内存?Java数组的大小不受限制,除非您得到大约整数.max\u值。这不是问题所在 第一个问题是使用了错误的数据结构。这不是数组的用途。您希望将一些字符串映射到其他字符串,因此这正是您应该使用映射的情况。您的
替换
应该是Map
类型,特别是使用HashMap
实现。您可以在类中使用静态初始值设定项填充映射,例如
private static Map<String, String> replacements;
static {
replacements = new HashMap<String, String>();
replacements.put("*4u", "kiss for you");
.....
}
我没有尝试编译上面的内容,但它应该是正确的想法。使用
StringBuilder
这种方式将使替换运行得更快。Java没有限制任何东西,您是否进行了测试以证明这一点?顺便说一句,我不理解您在尝试替换之前比较字长的意图。这是某种优化吗?它可以以更优化、更优雅的方式完成。Slagoutput/msglower
包含哪些内容?请举个例子。对不起,我刚刚编辑过。它在一个数组中有5000个属性当我编译它时,错误来了错误:代码太大了,在我为(Map.Entry replacement:sd.replacements){…}编码后,它说必需的:array或java.lang.iterable发现:Map@RickyKristianButar-但是,对了,这是我在不编译时错过的事情。应该是循环中已编辑的replacements.entrySet()
。您应该能够在文档中找到类似的内容。
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());
}
}