Добавить срез на срез фрагментов

63
4

У меня есть структура данных:

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
}

Оба они не работают, может быть, кто-то может объяснить, как я могу добавить срез для такой структуры.

спросил(а) 2021-01-25T21:32:25+03:00 4 месяца, 2 недели назад
1
Решение
100

Вы сомневаетесь. Я предполагаю, что вы пытаетесь создать типичный инвертированный индекс. В этом случае вы, вероятно, захотите сделать что-то вроде этого:

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...)

добавляет срез к срезу.

Рекомендации:

Добавление и копирование фрагментов

Массивы, срезы (и строки): Механика 'append'

инвертированный индекс

ответил(а) 2021-01-25T21:32:25+03:00 4 месяца, 2 недели назад
45

Я не уверен, что полностью понимаю, что вы делаете, но что-то вроде этого должно работать нормально, заменяя slice на map:

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)
}

ответил(а) 2021-01-25T21:32:25+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема