自己写的一个匹配算法,感觉还可以,希望大家指正
算法目标:
匹配两个数组中相同的数量,如果达到2个则返回true.否则返回false
如:
String[] usertag = {"21","30","13","4","31"};
String[] mytag= {"15","7","21","3","30"};
因为能匹配到 21 和3 所有返回true;
思路:
1.先排序,
2.两个数组中先选择第一个元素大的,作为第一层循环的主体
3.比较的时候另一个数组中
遇到小的就从他的数组中剔除掉,然后continue,
遇到大的break,进行下一次比较
遇到相等的,就计数,并break,进行下一次比较
/**
* 算法的作用:
* 匹配两个整型数组的,如果有至少有两个能匹配则返回true,否则返回false
* @param usertag
* @param mytag
* @return
*/
public static boolean findTagRecommendUserAtListTwoSame(String[] usertag,String[] mytag){
int tagPass = 0;
List<Integer> myTagList = new ArrayList<Integer>();
List<Integer> userTagList = new ArrayList<Integer>();
for (int i = 0; i < mytag.length; i++) {
myTagList.add(Integer.parseInt(mytag[i]));
}
for (int i = 0; i < usertag.length; i++) {
userTagList.add(Integer.parseInt(usertag[i]));
}
/**
* 先把数组排序为有序数组,这样才能再比较中剔除,减少比较次数,提高效率
*/
Collections.sort(myTagList);
Collections.sort(userTagList);
/**
* 下面之所以这样写是因为,找到第一个数字是比较大的作为目标遍历对象【也就是第一层遍历的对象】
* 之所以这样写是因为:你会发现,对于我这个算法,因为数组是排序的,如果第一个是大的数字的话,能够更快的匹配数据,这样能减少循环次数。缩短比较的时间
* 如下图,4匹配【3,7,15,21】则经过第一次比较可以把3剔除掉,反之则不行,用3匹配【4 13 21 31】则一个也剔除不掉
*/
List<Integer> destionArr = new ArrayList<Integer>();
List<Integer> sourceArr = new ArrayList<Integer>();
if(myTagList.get(0)>userTagList.get(0)){
destionArr = myTagList;
sourceArr = userTagList;
}else{
destionArr = userTagList;
sourceArr = myTagList;
}
for (int i = 0; i < destionArr.size(); i++) {//"4","13","21","31"
if(tagPass==2||sourceArr.size()==0){//如果两个已经匹配够,或者,被匹配数据已经没有数据则结束
break;
}
Integer destionTag = destionArr.get(i);
for (int j = 0; j < sourceArr.size(); ) {//"3","7","15","21"【一定注意这里没有使用j++ 循环也不一定要j++,这里只是执行一个语句而已】
Integer sourceTag = sourceArr.get(j);
if(destionTag==sourceTag){
tagPass++;
sourceArr.remove(j);//这里虽然也剔除了,可是他直接跳出了循环,下次重新比较的时候,因为要执行for(j=0;xxx),所有这里不需要像下面那样给j赋值为0
break;
}else if(destionTag>sourceTag){
sourceArr.remove(j);
j=0;//剔除以后,因为还要继续从新数组的第一个开始比较,所有这里j重新置为0,
continue;
}else if(destionTag<sourceTag){
break;
}
}
}
if(tagPass==2){
return true;
}else{
return false;
}
}
大家如果觉得哪里不合适或者可以改进的地方,可以给我留言!