比如一篇文章我要在其中随机插入N条Url。一般做法是取文章长度的随机值,我开始也是这样的,但是随机值很可能出像相近的时候文章插入的链接就会成这样
<a href=/a/zhanshenxiafan/2012/0701/3042.html>“卡”消费的20<a href=xxxxxxxxxx>xxxxxxxxxxx</a>种思维方式</a>
如果两个随机索引太接近就会成这样,然后我就开始记录随机到的索引地址以及插入链接的长度。
可是文章长度会因为插入的链接改变所以记录的索引用来判断也不好用,所以在此请求各位大侠,前辈如何向文章中插入指定条数的链接,相互不影响。
使用缓存记录插入信息,最后一起插入:
List<KeyValuePair<int, string>> _indexes = new List<KeyValuePair<int, string>>(); //执行虚拟插入,只是把数据记录插入到一个缓存中,然后一次性再插入
private void Insert(string data) { int position = new Random().Next(0, filelength);//此处是文件长度 indexes.Add(new KeyValuePair(position, data)); } private void DoInsert(int index, string data) { //执行实际的插入行为 }
//所有的插入执行完成后,调用这个方法,执行真正的插入,插入过程为从最后面往前插入 private void OverInsert() { foreach(var pair in _indexes.OrderByDescending(o=>o.Key)) { DoInsert(pair.Key, pair.Value); } }
生成字典,对被使用的索引位置进行信息记录,记录当前索引位置的内容和长度。
当有在这个索引位置插入内容的时候,更新这个索引位置:
List<InfoPair> _indexes = new List<InfoPair>(); private class InforPair { public int Index;//数据在文件中的索引位置 public int Length;//数据长度 } private void Insert(string data) { int position = new Random().Next(0, fileLength);//fileLength为实时文件长度 foreach(var item in _indexes) { if(item.Index >= position) { item.Index += data.Length; } else if(item.Index + item.Length > position) { pisition = item.Index + item.Length;//修正position,把新插入的放在后面,如果要放前面,则设置为item.Index,同时把item的Index增加一个data的长度值 } } DoInsert(position, data);
_indexes.Add(new InfoPair{Index = position, Length = data.Length}); } private void DoInsert(int position, string data) { //执行实际的插入 }
上面的代码给你个思路,起到抛砖引玉的作用。具体的你自己调试下,修正其中可能存在的BUG并必要的时候优化(我凭想想写的代码,没启用VS)。
你建立 一個 已經插入 的 數據列表,包括插入點。然後定義一個 範圍。如果隨即 數,在這些範圍中,就重新生成隨即數據,直到 找到合適的插入點,也就是不在所有 範圍內的點。
你现在是从前往后插入
有没有想过从后往前插入?这样就能解决你的问题
1. 把字符串分成n个子串
2. 在每一份之前(insert)或之后(append)url
3. 合并n个字串