【发布时间】:2018-04-15 00:48:23
【问题描述】:
我目前正在编写一个程序,该程序需要在 String 的 ArrayList 的 ArrayList 中将相似的字符串与 Damerau levenshtein 算法进行比较。现在,我这样做的方式是通过嵌套代码循环:
Damerau d = new Damerau();
for(int i = 0;i<outer.size();i++) {
System.out.println(i);
String cstring = outer.get(i).get(5);
for(ArrayList<String> current : outer) {
if(d.distance(cstring , current.get(5)) < 30){
//System.out.println(cstring);
outer.get(i).set(0, current.get(0));
break;
}
}
}
但这真的很慢,因为 arraylist 由 33000 个字符串 arraylists 组成。
【问题讨论】:
-
如果您正在从数据库中读取数据,那么不是获取所有数据,而是只提取所需的数据。 SQL 查询比逐行比较要快。如果您不使用 RDBMS,那么我建议您至少使用 sqlite 转储数据并使用查询获取数据。另一件事是使用一些分析器工具并确定哪条线正在消耗越来越多的时间。如果可能,请尝试将数据拆分为较小的列表和独立线程。
-
您是否对代码进行了基准测试以查看花费最多的时间?一种优化可能是只在外循环中获取一次
outer.get(i),而不是在每次内循环迭代中获取它。 -
如何标记您已经检查的值以跳过它们?如果匹配,您也可以更新
current,而不是只设置out.get(i)。 -
如果您在比较相似的字符串,您是否尝试过对数据进行排序?
-
@phflack 算法比较
String中的相似性与String不相似,所以Zen和Ten相似,距离为1。你不能这样排序。
标签: java loops arraylist nested nested-loops