/** 添加 */ public void add(T obj) { lock (_queue) { _queue.offer(obj); } }
/** * 构造失效节点: 一个节点的失效节点所代表的字符串是该节点所表示它的字符串的最大 部分前缀 */ private void buildFailNode() { // 以下构造失效节点 SQueue <DFANode> queues = new SQueue <DFANode>(); dfaEntrance.failNode = dfaEntrance; // foreach (DFANode v in dfaEntrance.dfaTransition) { v.level = 1; queues.offer(v); v.failNode = dfaEntrance; // 失效节点指向状态机初始状态 } ; DFANode curNode = null; DFANode failNode = null; while (!queues.isEmpty()) { curNode = queues.poll(); // 该节点的失效节点已计算 failNode = curNode.failNode; foreach (var kv in curNode.dfaTransition.entrySet()) { char k = kv.key; DFANode v = kv.value; // 如果父节点的失效节点中有条相同的出边,那么失效节点就是父节点的失效节点 while (failNode != dfaEntrance && !failNode.dfaTransition.contains(k)) { failNode = failNode.failNode; } v.failNode = failNode.dfaTransition.get(k); if (v.failNode == null) { v.failNode = dfaEntrance; } v.level = curNode.level + 1; queues.offer(v); // 计算下一层 } } }
/** 预备下载 */ public static int preDownLoad() { _needLoadSize = 0; _loadQueue = new SQueue <ResourceSaveData>(); _versionData.resourceDic.forEachValue(v => { //未处理的且需要下载的部分 if (v.state == ResourceSaveStateType.None && ResourceSaveType.needFirst(v.saveType)) { _loadQueue.offer(v); _needLoadSize += v.size; } }); return(_needLoadSize); }