list1和list2分别是从数据库中查询得到的数据,比对list1中的值在list2中有那些是存在的,那些是不存在的。两个list循环遍历,但是两个list中都有几万条数据,这样的话比对次数就list1.size()*list2.size()次。所以速度慢到不行。有什么好的解决办法?现在已经做了,比对上的,不再比对,速度还是不行。list中存的都是对象,而且我只比较每个对象的一个属性的相似度。比对完成后返回完全一致的,80%以上,没有比对上的。
解决方案 »
- form的action
- 变态的问题
- weblogic版本下异常
- 如何将客户端获取的身份证照片上传至服务器?
- jsp连接数据库问题~~~快疯了!!有人来帮帮我啊~~~
- java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error setting up static cursor cache.
- 在tomcat下无法下载rar文件,而是直接打开了,求救!
- 求一个日文的式样书
- 救命呀,要多少分给多少分!!!
- 谁可以给我说清楚asp和servlet的区别?!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!
- 求一个像CSDN提问问题时候的编辑器?
- 如何用回车模拟Tab两下(跳过中间的readonly),急急急!!!请高手帮忙
1、取出list1中不重复的值,保存到list3;
2、取出list2中不重复的值,保存到list4;
3、循环取出list3到list4对比,要list3*list4次数。
再遍历list1,取其值a与list3的 取整(list3.length/2)对应的值进行比较,如果a大,这与大于中间值的部分的中间值进行比较,依次类推,可以大大的减少比较次数,不过不知道是不是容易实现,lz可以参考一下
list2排序为list4
然后可以使用合并两个有序序列的算法那样
时间复杂度:mlgm+nlgn+(m+n) 比m*n小好多
但是这样数据库可能就受不了,查询数据库也要几万次。
再遍历list1,取其值a与list3的 取整(list3.length/2)对应的值进行比较,如果a大,这与大于中间值的部分的中间值进行比较,依次类推,可以大大的减少比较次数,不过不知道是不是容易实现,lz可以参考一下list1排序为list3
list2排序为list4
然后可以使用合并两个有序序列的算法那样
时间复杂度:mlgm+nlgn+(m+n) 比m*n小好多以上想法都很好,建议楼主。用用算法
这个设计到算法问题。
第二,list1排序为list3
list2排序为list4
然后可以使用合并两个有序序列的算法那样
时间复杂度:mlgm+nlgn+(m+n) 比m*n小好多
我查出的list1和list2已经是排序过的,“但是合并两个有序序列的算法那样”具体怎样。
public static void main(String[] args) {
List datelist = new LinkedList();//list1
for(int d = 1;d < 5; d++){
Date date = new Date();
date.setId(d);
date.setValue("abc"+String.valueOf(d+1));
datelist.add(date);
}
List newdate = new LinkedList(); for(int i = 0;i < datelist.size();i++){
Date date = (Date)datelist.get(i);
newdate.add(i,date.getValue());//将要比较的值放入新的List
} List datelist1 = new LinkedList(); //list2
for(int d = 1;d < 5; d++){
Date date = new Date();
date.setId(d);
date.setValue("abc"+String.valueOf(d));
datelist1.add(date);
}
for(int i = 0;i < datelist1.size();i ++){
Date date = (Date)datelist1.get(i);
if(newdate.contains(date.getValue())){ //如果list1中有list2中的值
System.out.println("date true == "+newdate.indexOf(date.getValue())); //打印list1中该对象的位置
}
}
} private static class Date{ public Date(){
}
private int id;
private String value; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}
}随便写了一下 lz可以参考一下,方法比较笨!
我要比较的是企业名称,我想得到list1中的企业在list2中没有或相似的企业。但是问题是有可能企业名称中少一两个字,比如“有限公司”变成“公司”,北京市变成了北京,这样就叫相似的,这个我也需要,至于相似到什么程度等规则我都已经定好了,我是把企业名称拆开成一个字一个字的有序的比对,所以说数据库中直接比对不了的。且无法比对大小(全是中文)。现在数据量少的话,没有问题。但是数据量多了,就要循环list1.size()*list2.size()-已经比对上的size(企业名称完全一致的)。需要很长时间.就像上面说的涉及运算,有谁能提供好点的运算?或者更好的想法。
如果已经排过序的,那就直接合并。import java.util.ArrayList;
public class merge { private ArrayList<String> notMatch = new ArrayList<String>();
private ArrayList<String> match = new ArrayList<String>();
public void mergeArray(ArrayList<String> list1, ArrayList<String> list2) {
int i = 0;
int j = 0;
while (i < list1.size() && j < list2.size()) {
if (list1.get(i).compareTo(list2.get(j)) < 0) {
notMatch.add(list1.get(i));
i++;
}
else if (list1.get(i).compareTo(list2.get(j)) == 0) {
match.add(list1.get(i));
i++; j++;
}
else {
notMatch.add(list2.get(j));
j++;
}
}
//add remaining items
while (i < list1.size()) {
notMatch.add(list1.get(i));
i++;
}
while (j < list2.size()) {
notMatch.add(list2.get(j));
j++;
}
//print
for (i = 0; i < notMatch.size(); i++) {
System.out.println(notMatch.get(i));
}
System.out.println("*****************");
for (j = 0; j < match.size(); j++) {
System.out.println(match.get(j));
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> list1 = new ArrayList<String>();
list1.add("abc");
list1.add("abcd");
list1.add("ert");
list1.add("ghj");
ArrayList<String> list2 = new ArrayList<String>();
list2.add("bcv");
list2.add("cxz");
list2.add("ert");
new merge().mergeArray(list1, list2);
}}
这个match到是很快的到了,但是notmcatch(数据量还是很大)还要再进行比对,要找出相似80%以上的。match其实数量并不是很多。还是一样的问题,我试了用几个线程,一个线程执行一部分,但是更慢。如果谁还有更好的方法,我可以在加分。谢谢了。