`
ansjsun
  • 浏览: 203063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

两个大数字相乘

 
阅读更多

没什么只是.一个demo

 

 

package net.csdn.service.tag.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import love.cq.util.StringUtil;
import net.csdn.exception.ArgumentErrorException;
import net.csdn.pojo.tag.ObjTag;
import net.csdn.pojo.tag.Tag;
import net.csdn.service.tag.util.domain.MyTag;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.log.Log;
import org.nutz.log.Logs;

@IocBean
public class DocTagService {
	private static final Log log = Logs.getLog("DocTagService");
	@Inject
	private TagsManageService tagsManageService = null;

	@Inject
	private DocStoreRemoteService docStoreRemoteService;

	public boolean insert(String typeName, String jsonDate, String tagsStr) {
		if (StringUtils.isBlank(tagsStr)) {
			throw new ArgumentErrorException("tags 不可以为空");
		}
		ObjTag objTag = null;
		JSONObject fromObject = JSONObject.fromObject(jsonDate);
		log.info(fromObject.get("id") + "	" + tagsStr);
		String[] tags = tagsStr.split(",");
		String body = StringUtil.rmHtmlTag(fromObject.getString("body"));

		// /如果正文为空
		if (StringUtil.isBlank(body) || tags == null || tags.length == 0) {
			return false;
		}

		String tempTagStr = null;

		// 删除这条记录
		delete(typeName, fromObject.getInt("id"));

		for (int i = 0; i < tags.length; i++) {
			// 先查询tags是否存在于数据库中.如果不存在就创建一个
			tempTagStr = tags[i].toLowerCase().trim();
			if (StringUtil.isBlank(tempTagStr)) {
				continue;
			}
			Tag tag = tagsManageService.findTagByName(tempTagStr);

			if (tag == null) {
				tag = new Tag();
				tag.setName(tempTagStr);
				tagsManageService.saveTag(tag);
			}
			// 插入一条记录到数据库中
			objTag = new ObjTag();

			objTag.setObject_id(fromObject.getInt("id"));

			objTag.setTag_id(tag.getId());

			objTag.setCreated_at(fromObject.getLong("created_at"));

			try {
				objTag.setChannel_id(fromObject.getInt("channel_id"));
			} catch (Exception e) {
				log.info("channel get error!");
			}

			tagsManageService.saveAbstractObjTag(typeName, objTag);
		}
		return true;
	}

	public void setTagsManageService(TagsManageService tagsManageService) {
		this.tagsManageService = tagsManageService;
	}

	/**
	 * 在tag系统中删除文章
	 * 
	 * @param typeName
	 * @param objectId
	 */
	public void delete(String typeName, Integer objectId) {
		// TODO Auto-generated method stub
		if (objectId == null) {
			throw new ArgumentErrorException("待删除文章Id 不可以为空");
		}
		tagsManageService.deleteDocTag(typeName, objectId);
	}

	/**
	 * 超早tag的数量
	 * 
	 * @param typeName
	 * @param objectId
	 */
	public int findTagCount(String typeName, Integer objectId) {
		// TODO Auto-generated method stub
		if (objectId == null) {
			throw new ArgumentErrorException("待删除文章Id 不可以为空");
		}
		return tagsManageService.findTagCount(typeName, objectId);
	}

	/**
	 * tag补录,慎用会覆盖用户原本的tag
	 * 
	 * @param type
	 * @param fromId
	 * @param endId
	 * @return
	 */
	public void updateTagByDoc(String typeName, int fromId, int endId, RecommenderService rs, HashMap<String, Integer> tagMap, boolean needSuggestTag) {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		fromId = Math.max(fromId, 1);
		for (int i = fromId; i <= endId; i++) {
			if (i % 100 == 0) {
				sb.append(i);
				try {
					insertTagsAndUpdateMongo(typeName, sb.toString(), rs, tagMap, needSuggestTag);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					log.error(e + " " + sb);
				}
				sb = new StringBuilder();
			} else {
				sb.append(i + ",");
			}
		}
		// 补录
		if (sb != null && sb.length() > 0) {
			sb.append(0);
			try {
				insertTagsAndUpdateMongo(typeName, sb.toString(), rs, tagMap, needSuggestTag);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				log.error(e + " " + sb);
			}
		}
	}

	/**
	 * 插入tag
	 * 
	 * @param typeName
	 * @param ids
	 * @param rs
	 * @param tagMap
	 */
	private void insertTagsAndUpdateMongo(String typeName, String ids, RecommenderService rs, HashMap<String, Integer> tagMap, boolean needSuggestTag) {
		// TODO Auto-generated method stub

		JSONArray objs = docStoreRemoteService.findByIds(typeName, null, ids);
		JSONArray newObjs = new JSONArray();
		// 如果mongo那什么都没查出来就不走后面的了
		if (objs == null || objs.size() == 0) {
			return;
		}

		// 删除所有的关联
		tagsManageService.deleteDocTagByIds(typeName, ids);

		List<ObjTag> all = new ArrayList<ObjTag>();

		String title = null;
		String body = null;
		// 重新插入
		for (Object object : objs) {
			JSONObject job = (JSONObject) object;

			// 防止出现空hash
			if (job.size() <= 3) {
				continue;
			}

			List<MyTag> tag_suggest = null;

			try {

				StringBuilder sb = new StringBuilder();
				if (needSuggestTag) {

					try {
						title = job.getString("title");

					} catch (Exception e) {
					}

					try {
						body = job.getString("body");
					} catch (Exception e) {
					}

					tag_suggest = rs.tag_suggest(title, body, "csdn", 5);
					for (MyTag myTag : tag_suggest) {
						all.add(insertTagsAndUpdateMongo(tagMap, job, sb, myTag, typeName));
					}
				} else {
					String tag = job.getString("tag");
					if (StringUtil.isNotBlank(tag)) {
						String[] tags = tag.split(",");
						for (String string : tags) {
							if (StringUtil.isNotBlank(string)) {
								MyTag myTag = new MyTag(string.trim().toLowerCase(), 0, string.length());
								all.add(insertTagsAndUpdateMongo(tagMap, job, sb, myTag, typeName));
							}
						}
					} else {
						continue;
					}
				}
				if (StringUtil.isNotBlank(sb) && sb.length() > 1) {
					job.put("tag", sb.subSequence(0, sb.length() - 1));
					newObjs.add(job);
					log.info("insert " + job.getString("tag"));
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		try {
			// 批量保存关联
			if (all.size() == 0) {
				log.info("not have any change to skip! " + ids.substring(0, 10));
				return;
			}

			if (needSuggestTag && newObjs.size() > 0) {
				// 批量修改mongo中的tag
				log.info("update mongo ok" + newObjs.size());
				docStoreRemoteService.update(typeName, newObjs);
			}

			StringBuilder sb = new StringBuilder("INSERT INTO ");
			sb.append(tagsManageService.getTableName(typeName));
			ObjTag objTag = null;
			sb.append(" (tag_id,object_id,created_at,channel_id) values ");
			for (int i = 0; i < all.size(); i++) {
				objTag = all.get(i);
				sb.append("(");
				sb.append(objTag.getTag_id());
				sb.append(",");
				sb.append(objTag.getObject_id());
				sb.append(",");
				sb.append(objTag.getCreated_at());
				sb.append(",");
				sb.append(objTag.getChannel_id());
				if (i == all.size() - 1) {
					sb.append(");");
				} else {
					sb.append("),");
				}
			}

			tagsManageService.execute(sb.toString());
			log.info("batchSave mysql ok" + all.size());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			log.error("batchSave mysql error" + ids);
			e.printStackTrace();
		}
	}

	private ObjTag insertTagsAndUpdateMongo(HashMap<String, Integer> tagMap, JSONObject job, StringBuilder sb, MyTag myTag, String type)
			throws InstantiationException, IllegalAccessException {
		sb.append(myTag.getName() + ",");
		Integer tagId = tagMap.get(myTag.getName());
		// 如果不在hash表中就查数据库
		if (tagId == null) {
			Tag tag = tagsManageService.findTagByName(myTag.getName());
			// 如果为空就插入一个
			if (tag == null) {
				tag = new Tag();
				tag.setName(myTag.getName());
				tagsManageService.saveTag(tag);
			}
			// 设置到map中
			tagMap.put(tag.getName(), tag.getId());
			tagId = tag.getId();
		}
		// 插入一条记录到数据库中
		ObjTag objTag = new ObjTag();

		objTag.setObject_id(job.getInt("id"));

		objTag.setTag_id(tagId);

		objTag.setCreated_at(job.getLong("created_at"));

		try {
			objTag.setChannel_id(job.getInt("channel_id"));
		} catch (Exception e) {
			objTag.setChannel_id(-1);
			log.error("channel get error!");
		}

		return objTag;
	}

}
分享到:
评论

相关推荐

    分治法求两个大整数相乘

    ### 分治法求两个大整数相乘 #### 一、问题背景及描述 在计算机科学领域,处理大整数的运算是一项常见的需求,尤其是在密码学、数据加密以及某些科学计算场景中。对于传统整数类型(如 `int`, `long` 等)无法表示...

    用C语言编写的计算两个1000位数字相乘的源程序

    本篇文章将详细讨论如何使用C语言来实现两个1000位数字相乘的算法。这个程序是针对大数相乘问题的一个解决方案,适用于处理超过常规整型变量范围的大型整数。 首先,我们需要理解C语言的基础数据类型,如int、long...

    华为的一道面试题,两个长数字相乘

    这段代码提供了一个具体的实现思路,通过将两个大整数分别存储为字符数组,并利用逐位相乘的方法来实现乘法运算。具体步骤如下: 1. **初始化**:首先定义一个足够大的数组`s`用于存放乘法的结果,其长度等于两个...

    任意大的两个数相乘

    以下是对“任意大的两个数相乘”这个知识点的详细说明。 **大数的概念** 大数是指超过常规数据类型所能表示的最大值的整数。在大多数编程语言中,如C、C++或Java,整型变量有其最大值限制,如32位系统中的int最大值...

    两个很大的整形数相乘

    在编程领域,尤其是在处理数值...总之,处理两个超大数相乘的问题,需要理解大数表示和高效算法,并能够熟练运用C语言进行编程实现。通过学习和实践,不仅可以掌握这一技能,还能为解决其他复杂计算问题打下坚实基础。

    用C实现两个大数的相乘(位数可以上万)

    本文将详细介绍如何使用C语言通过链表和数组实现两个大数的相乘功能,其中大数的位数可以达到上万位。 #### 题目概述 本题目要求设计一个程序,能够处理两个大数的相乘操作,这里的“大数”指的是位数可以达到上万...

    两个10位以上大整数相乘 算法 设计

    1. **输入接收**:首先,使用字符数组接收用户输入的两个大整数,这是因为C++的标准输入流`cin`无法直接处理超过`int`类型的整数。字符数组可以用来存储任意长度的字符串形式的数字。 2. **数据转换**:接收到的...

    长整型相乘的实现程序

    这个压缩包中的内容显然是一个关于长整型相乘的实现程序,包含两个源文件(test.cpp、LongIntMultiply.cpp)和一个头文件(LongIntMultiply.h)。这里我们将详细讨论长整型的概念、实现方法以及可能涉及的算法。 1....

    大整数相乘算法 分治法

    在具体实现上,首先,输入的两个大整数会被转换成8的倍数,这是因为分治法的处理过程中,需要对每一位进行操作,8的倍数可以使处理更为简洁。接着,通过递归调用,将大整数逐步分解到单个数字的乘法,直到乘法操作...

    JS实现两个大数(整数)相乘

    那么如何实现两个大数相乘呢?我用JS实现了一下,代码如下: 代码如下: console.log(bigMut(“567”, “1234”)); // 699678 function bigMut(big, common) { big += “”; common += “”; if (big.length &lt; ...

    分治 大整数相乘

    在传统的算术运算中,我们通常使用乘法运算符 `*` 来完成两个数字的乘法,但在处理大整数时,这种方法不再适用,因为标准数据类型无法存储这样的结果。 在C++中,我们可以利用自定义数据结构(如链表、数组等)来...

    算法分析与设计论文-可溢出的两个整型数相乘

    当两个整型数相乘的结果超出了该数据类型能表示的最大值,就会发生溢出(overflow)。溢出并不总是导致编译错误,而是可能导致运行时错误,因为计算结果将不再正确。例如,32位无符号整型最大能表示4294967295,如果...

    大整数相乘.cpp

    假定有两个字符串表示的整形数,要求写一个函数,实现两个数字字符串的乘积,函数返回值也是字符串。我们不能直接将整形字符串转换为数字后去相乘,因为字符串表示的数字可能相当大,直接转换成数字会导致信息丢失,

    超大整数相乘算法的VB实现源代码

    1. 将两个大整数a和b分解为: a = a1 * 2^k + a0 b = b1 * 2^k + b0 其中a1和b1是a和b各自高半部分,a0和b0是低半部分,k是适当的选择。 2. 计算三个中间值: - z0 = a0 * b0 - z1 = (a0 + a1) * (b0 + b1) -...

    长整型相乘优化

    它将两个n位数的乘法分解为三个较小的乘法和若干次加法,复杂度为O(n^1.585),比传统的O(n^2)算法更快。基本思想是将两个数各分为高位和低位两部分,然后用这三个部分的组合进行计算。 2. **Toom-Cook算法**:与...

    大数相乘算法解析,实现20位的大数相乘

    由于两个20位的大数相乘,结果最多不超过40位,所以mResult的长度至少为2 * (MAX - 1),其中MAX为21。 2. **输入大数**:通过函数InputNumber读取用户输入的两个大数,将字符输入转换成整数数组表示。 3. **初始化...

    大整数相乘问题--分而治之

    在这个大整数相乘的问题中,我们就是用这种策略来高效地完成乘法运算。 一、基础理论 1. 大整数:大整数是指超过普通整型数据所能表示范围的整数,通常通过数组或链表等数据结构存储。 2. 分而治之:分而治之是算法...

    大整数相乘(C++实现),理论上整数位数任意

    3. **逐位乘法**:在C++中,这个过程涉及两个数组的逐个元素相乘,然后累加到结果数组。每个乘积都需要与另一个数组的相应位置进行对齐,然后根据需要进行进位操作。 4. **动态分配内存**:由于我们不知道输入的大...

    大数相乘c语言

    标题“大数相乘c语言”和描述“两个超过计算机所能表示的数相乘,利用数组存储大数,进行相乘”所提及的就是这种技术。 大数相乘的基本思路是将每个大数拆分成数组中的每一位,然后按照传统的笔算乘法方法进行计算...

Global site tag (gtag.js) - Google Analytics