类似redo和undo的实现
需要两个表,一个存储add,一个存储del,表中有操作人,字符串,操作对象,操作位置(index),操作时间(顺序)
举个栗子:
Del表
操作人 字符串 操作对象 操作位置 顺序
B 123456789 9 8 0
A 123456789 2 1 1
A 13456789 4 2 2
A 1356789 6 4 3
从del表倒叙查找,逐个恢复即可还原字符串
如果单纯的记录谁添加或删除了什么,就直接存数组,不用管操作顺序
栗子:
做一个操作人类,里面有操作人和操作对象
class oper
{
string name;
string num;
}
A编辑后:
12345789,A删除了2
oper myoper = new oper();
myoper.name = "A";
myoper.num = 2;
lstDel.Add(myoper);
感谢你的回复。
不过我要的效果是这个样子的:原始字符串:12345678
A编辑以后的字符串:13579
则结果是:
1 <A_del>2</A_del> 3 <A_del>4</A_del> 5 <A_del>6</A_del> 7
<A_del>8</A_del><A_add>9</A_add>
B(在A的基础上,也就是13579的基础上)编辑以后的字符串是:12457890
则结果是:
1 <A_del>2</A_del> <B_add>2</B_add> <B_del>3</B_del> <B_add>4</B_add><A_delete>4</A_delete> 5 <A_del>6</A_del> 7 <A_del>8</A_del><B_add>8</B_add><A_add>9</A_add> <B_add>0</B_add>
上面写的有点儿乱,不知道你是否理解我的意思。就是每个人做的任何一个操作都要把它记下来。最好不要借助数据库。要算法实现。当然,那些标签是我自己定义的,也可以写成其他的。
@jone_e: 我觉得你分开存比较好
1 <A_del>2</A_del> <B_add>2</B_add> <B_del>3</B_del> <B_add>4</B_add><A_delete>4</A_delete> 5 <A_del>6</A_del> 7 <A_del>8</A_del><B_add>8</B_add><A_add>9</A_add> <B_add>0</B_add>
这么一存你就不知道A和B的操作顺序了,也就没法说“B(在A的基础上,也就是13579的基础上)编辑以后的字符串是:12457890”
建议这么存:
源字符串:12345678
<A_del>2</A_del>
<A_del>4</A_del>
<A_del>6</A_del>
<A_Add>9</A_Add>
<B_Del>9</B_Del>
<B_Add>4</B_Add>
<B_Add>6</B_Add>
上面就是按操作顺序存的
@WuRang: 首先,再次感谢你的热心回复。
其实,我并不关心每个人的操作顺序,我只关心每个人的操作结果。实际的业务逻辑大概是这样的:
比如:某人写了一篇文章,就叫文章X,分别交给A,B,C,D四个人编辑。每个人编辑后,都产生了一篇新的文章,分别是文章A,文章B,文章C,文章D。我现在需要比较X,A,B,C,D这5篇文章,得出一篇文章,这篇文章可以展示A,B,C,D这四个人分别做了哪些改动。
如果是这种业务逻辑,其实我并不关心每个人的操作顺序,我只关心他们到底改动了什么内容,然后我把这些内容分别用html标签表示出来,展示在网页上。
上图是我做的一个效果。每个人的改动都分配一种颜色,划横线的表示删除,带颜色的字体表示与颜色对应的哪个人添加的内容。
其实上图的效果并不完全正确,因此就有了博客园的这个提问。
不知道,针对这个业务逻辑,你有没有什么更好的解决方案。当然,你上面的回答其实已经给了我一些启示,我沿着那条路往下走,发现困难挺多。。
@jone_e: 有几个不明白的地方
1.某人写了一篇文章,就叫文章X,分别交给A,B,C,D四个人编辑。每个人编辑后,都产生了一篇新的文章
也就是说ABCD四个人编辑的都是源X,这就和题目中的问题冲突,题目中B是在A编辑后产生的X1的基础上做的编辑而不是源X
原始字符串: 12345678 A编辑后: 135789,则A删除了2 4 6,增加了9; B编辑后: 1235678,则B删除了9,增加了2 6
2.每个人的改动都分配一种颜色,划横线的表示删除,带颜色的字体表示与颜色对应的哪个人添加的内容。
不理解是什么意思,贴出来的图表示的是什么?是每个人修改后文章的超链接?
@WuRang: 哦,我说错了,我不应该写成分别交给A,B,C,D。应该是A修改X,B在A的基础上修改,C在B的基础上修改,D在C 的基础上修改。
关于颜色:
比如A的修改的内容用红色表示,则A增加的内容是红色字体的,A删除的内容的删除线是红色的,
B修改的内容用蓝色表示,则B增加的内容是蓝色字体的,B删除的内容的删除线是蓝色的,同时如果B删除了A增加的内容,则这段内容字体是红色的,删除线是蓝色的;
关于贴出来的图:
这个图是我目前做到的效果,但是这个效果是有问题的,未能实现我期望的结果。只是想给你一个对期望结果的直接展示,没想到让你误解了。
谢谢你这么热心。这段时间忙,没有常来博客园。还是博客园好啊。
@jone_e: 还在研究中。up
这个项目有意思,研究一下 mark~~
楼主解决了么?
提供个线索
我还没有解决。。。最近忙,没时间管这个了。