diff --git a/glist/linkedlist.go b/glist/linkedlist.go index fdacafe..77424f8 100644 --- a/glist/linkedlist.go +++ b/glist/linkedlist.go @@ -230,11 +230,24 @@ func (l *LinkedList[E]) PullFront() *E { // Iterator 获取该链表的迭代器 func (l *LinkedList[E]) Iterator() Iterator[E] { - return &LinkedListIterator[E]{next: l.First} + return &LinkedListIterator[E]{ + reverse: false, + next: l.First, + } +} + +// ReverseIterator 获取反向迭代器 +func (l *LinkedList[E]) ReverseIterator() Iterator[E] { + return &LinkedListIterator[E]{ + reverse: true, + next: l.Last, + } } type LinkedListIterator[E any] struct { - next *Node[E] + //是否反向,如果为true,则是从尾部向头部迭代 + reverse bool + next *Node[E] } func (l *LinkedListIterator[E]) Has() bool { @@ -246,6 +259,10 @@ func (l *LinkedListIterator[E]) Next() E { if e == nil { panic("iterator is empty.") } - l.next = e.Next + if l.reverse { + l.next = e.Prev + } else { + l.next = e.Next + } return e.Element } diff --git a/glist/list.go b/glist/list.go index 0f1da8d..ca26569 100644 --- a/glist/list.go +++ b/glist/list.go @@ -20,6 +20,8 @@ type List[E any] interface { Set(index uint, element E) bool // Iterator 获取列表的迭代器 Iterator() Iterator[E] + // ReverseIterator 反向迭代器,从尾部向前迭代 + ReverseIterator() Iterator[E] } // Queue 队列 diff --git a/srt.go b/srt.go index e9c5a2d..8142b3f 100644 --- a/srt.go +++ b/srt.go @@ -19,7 +19,7 @@ const ( ) type SRTContent struct { - //序号,从1开始 + //序号,从1开始,只在写入文件的时候设置这个属性 Index int //开始时间,单位毫秒 Start int @@ -73,7 +73,7 @@ func LrcToSrt(lrc *LRC) *SRT { for it := lrc.LrcList.Iterator(); it.Has(); { lrcNode := it.Next() srtContent := &SRTContent{ - Index: index, + Index: 0, Start: lrcNode.time, Text: lrcNode.content, } @@ -159,7 +159,9 @@ func (s *SRT) mergeUp(other *SRT) { func (s *SRT) mergeBottom(other *SRT) { oq := other.Content if oq.IsNotEmpty() { - s.Content.PushFront(*(oq.PullBack())) + for it := other.Content.ReverseIterator(); it.Has(); { + s.Content.PushFront(it.Next()) + } } } @@ -179,8 +181,12 @@ func (s *SRT) Write(dst io.Writer) error { //6KB的缓冲 bufSize := 1024 * 6 writer := bufio.NewWriterSize(dst, bufSize) + index := 1 for it := s.Content.Iterator(); it.Has(); { - _, err := writer.WriteString(it.Next().String()) + content := it.Next() + content.Index = index + index++ + _, err := writer.WriteString(content.String()) if err != nil { return err }