假设有一个字符串被多个用户修改,所有用户都会将他们的操作发送到服务器,服务器会尝试将它们逐个合并到字符串中。
例如,从服务器发送给所有用户的字符串是:
aaabbbccc
所有用户都会看到完全相同的字符串,并将其修改为:
user1: bbbccc
user2: aaabbbcccddd
user3: aaaccc
修改将按顺序发送到服务器作为Jsons:
user1:
{
"delete": 0,
"length": 3
}
user2:
{
"insert": 9,
"content": "ddd"
}
user3:
{
"delete": 3,
"length": 3
}
服务器接收操作,并将基于基本字符串aaabbbccc
逐个合并它们。
我可以考虑调整操作的规则,如:
user1:
{
"delete": 0,
"length": 3
}
user2:
{
"insert": 6, // decreased because of previous deletion
"content": "ddd"
}
user3:
{
"delete": 0, // decreased by the first deletion
"length": 3
}
这意味着如果有删除/插入,如果需要,将更改后面的偏移量。
原始字符串aaabbbccc
将变为:
cccddd
最后。
但我不认为它是否是一个好的解决方案,因为它有时无法正确调整操作并在删除或插入时抛出一些OutOfBoundException。
我想知道是否有任何好方法可以做到这一点?或者某些库已经提供了这个功能?
答案 0 :(得分:0)
我认为你的方法是正确的,但你需要弄清楚为什么它会抛出超出限制的异常。删除确实是它的棘手方面,插入操作不应该相互冲突。首先执行所有插入然后应用删除可能更简单。我认为你的错误可能与忘记合并重叠的删除范围然后应用多个删除它们最初应用于字符串的同一部分的地方有关。
(例如,如果您有一组删除范围{[0, 10], [5, 20], [50, 55]}
,则需要在应用它们之前将这些删除合并到集{[0, 20], [50, 55]}
中。)