算法

自己写的一个匹配算法,感觉还可以,希望大家指正

算法目标:

匹配两个数组中相同的数量,如果达到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;
		}
}


大家如果觉得哪里不合适或者可以改进的地方,可以给我留言!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值