2014-03-29 55 views
0

我有數據結構:追加切片切片

type PosList []int 

type InvertedIndex struct { 
    Capacity int 
    Len  int 
    IndexList []PosList 
} 

我有Add方法問題:

func (ii *InvertedIndex) Add(posList PosList, docId int) { 
    if ii.Len == ii.Capacity { 
    newIndexList := make([]PosList, ii.Len, (ii.Capacity+1)*2) 
    for i := 0; i < ii.Len; i++ { 
     newIndexList[i] = make([]int, len(ii.IndexList[i])) 
     copy(newIndexList[i], ii.IndexList[i]) 
    } 
    ii.IndexList = newIndexList 
    } 

    ii.IndexList = ii.IndexList[0 : ii.Len+2] 
    ii.IndexList[docId] = posList 
    return 
} 

或者,我嘗試這樣的:

func (ii *InvertedIndex) Add(posList PosList, docId int) { 

    if ii.Len == ii.Capacity { 
    newIndexList := make([]PosList, ii.Len, (ii.Capacity+1)*2) 
    copy(newIndexList, ii.IndexList) 
    ii.IndexList = newIndexList 
    } 

    ii.IndexList = ii.IndexList[0 : ii.Len+2] 
    ii.IndexList[docId] = posList 
    return 
} 

他們兩個都不行,可能有人可以解釋我該如何追加一個切片來構造這樣的結構。

+0

他們怎麼不工作?你遇到了什麼錯誤?我想指出,如果你的'docId'參數不是內ii.Len'的'2兩個版本會產生恐慌;如果它保證是這樣的話,那麼只需使用'append()'可能會更好。 – Evan

回答

0

您的問題是混亂的。我假設你正試圖創建一個典型的倒排索引。在這種情況下,你可能想要做這樣的事情:

package main 

import "fmt" 

type DocId int 

type Positions []int 

type docIndex struct { 
    docId  DocId 
    positions Positions 
} 

type InvertedIndex struct { 
    docIndexes []docIndex 
} 

func New() *InvertedIndex { 
    return &InvertedIndex{} 
} 

func (ii *InvertedIndex) Add(docId DocId, positions Positions) { 
    for i, di := range (*ii).docIndexes { 
     if di.docId == docId { 
      di.positions = append(di.positions, positions...) 
      (*ii).docIndexes[i] = di 
      return 
     } 
    } 
    di := docIndex{ 
     docId:  docId, 
     positions: positions, 
    } 
    (*ii).docIndexes = append((*ii).docIndexes, di) 
} 

func main() { 
    ii := New() 
    docId := DocId(11) 
    positions := Positions{42, 7} 
    ii.Add(docId, positions) 
    positions = Positions{21, 4} 
    ii.Add(docId, positions) 
    docId = DocId(22) 
    positions = Positions{84, 14} 
    ii.Add(docId, positions) 
    fmt.Printf("%+v\n", *ii) 
} 

輸出:

{docIndexes:[{docId:11 positions:[42 7 21 4]} {docId:22 positions:[84 14]}]} 

聲明:

di.positions = append(di.positions, positions...) 

附加一個切片一個切片。


參考文獻:

Appending to and copying slices

Arrays, slices (and strings): The mechanics of 'append'

inverted index

0

我不知道我完全理解你在做什麼,但是這樣的事情應該只是做工精細,用map替換slice

type PosList []int 

type InvertedIndex struct { 
    Len  int 
    IndexList map[int]PosList 
} 
func (ii *InvertedIndex) Add(posList PosList, docId int) { 
    if ii.IndexList == nil { 
     ii.IndexList = make(map[int]PosList) 
    } 
    if _, ok := ii.IndexList[docId]; ok { 
     ii.IndexList[docId] = append(ii.IndexList[docId], posList...) 
    } else { 
     ii.IndexList[docId] = posList 
    } 

    ii.Len = len(ii.IndexList) 
}