sub_compare.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package sub_timeline_fixer
  2. type SubCompare struct {
  3. baseIndexDict map[int]int
  4. srcIndexDict map[int]int
  5. baseIndexList []int
  6. srcIndexList []int
  7. maxCompareDialogue int
  8. baseNowIndex int
  9. srcNowIndex int
  10. }
  11. func NewSubCompare(maxCompareDialogue int) *SubCompare {
  12. sc := SubCompare{
  13. baseIndexDict: make(map[int]int, 0),
  14. srcIndexDict: make(map[int]int, 0),
  15. baseIndexList: make([]int, 0),
  16. srcIndexList: make([]int, 0),
  17. maxCompareDialogue: maxCompareDialogue,
  18. baseNowIndex: -1,
  19. srcNowIndex: -1,
  20. }
  21. return &sc
  22. }
  23. // Add 添加元素进来比较,这里有个细节,如果理论上需要判断是 OffsetIndex 是 1-5 ,那么如果 1 add了,2 add 失败的时候,是应该清理后再 add 2
  24. // 还有一种情况,从 1-5,添加到 4 的时候false了,那么应该回退到 2 进行 add,而不是从 4 开始
  25. func (s *SubCompare) Add(baseNowIndex, srcNowIndex int) bool {
  26. // 如果是第一次 Add 的话,就直接把后续需要匹配的 OffsetIndex 字典的 Key 信息建立好
  27. // 再次调用本方法的时候就是 check 是否需要加的 key 存在于 字典 Key 中即可
  28. if len(s.baseIndexDict) == 0 {
  29. // 第一次
  30. for i := 0; i < s.maxCompareDialogue; i++ {
  31. s.baseIndexDict[baseNowIndex+i] = i
  32. s.srcIndexDict[srcNowIndex+i] = i
  33. s.baseIndexList = append(s.baseIndexList, baseNowIndex+i)
  34. s.srcIndexList = append(s.srcIndexList, srcNowIndex+i)
  35. }
  36. s.baseNowIndex = baseNowIndex
  37. s.srcNowIndex = srcNowIndex
  38. }
  39. // 可以理解为第二次开始才进入这个逻辑
  40. // 判断是否是预计的顺序 OffsetIndex
  41. _, okBase := s.baseIndexDict[baseNowIndex]
  42. _, okSrc := s.srcIndexDict[srcNowIndex]
  43. if okBase == false || okSrc == false {
  44. // 一定要存在,因为必须是可期待的 OffsetIndex
  45. return false
  46. }
  47. // 上面的判断仅仅是确定这个 index 是期望的范围内的,而不能保证顺序
  48. // 需要在这里没进行一次判断成功后,这里需要判断进入顺序判断的逻辑
  49. if s.baseIndexList[0] != baseNowIndex || s.srcIndexList[0] != srcNowIndex {
  50. return false
  51. }
  52. // 移除数组的首个元素
  53. s.baseIndexList = s.baseIndexList[1:]
  54. s.srcIndexList = s.srcIndexList[1:]
  55. return true
  56. }
  57. // Check 是否 Add 的元素已经足够满足 maxCompareDialogue 的数量要求了
  58. // 这里有个细节,如果理论上需要判断是 OffsetIndex 是 1-5 ,如果 add 5 check 的时候 false,那么应该清理后,回退到 2 进行 add,而不是 6 开始
  59. func (s *SubCompare) Check() bool {
  60. if len(s.baseIndexList) == 0 && len(s.srcIndexList) == 0 {
  61. return true
  62. } else {
  63. return false
  64. }
  65. }
  66. func (s *SubCompare) Clear() {
  67. s.baseIndexDict = make(map[int]int, 0)
  68. s.srcIndexDict = make(map[int]int, 0)
  69. s.baseIndexList = make([]int, 0)
  70. s.srcIndexList = make([]int, 0)
  71. s.baseNowIndex = -1
  72. s.srcNowIndex = -1
  73. }
  74. func (s *SubCompare) GetStartIndex() (int, int) {
  75. return s.baseNowIndex, s.srcNowIndex
  76. }