«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как переместить элемент фрагмента в Go, не создавая дубликатов?

Как переместить элемент фрагмента в Go, не создавая дубликатов?

Опубликовано 10 ноября 2024 г.
Просматривать:730

How do you move a slice item in Go without creating duplicates?

Перемещение элемента среза в Go: понимание правильных методов

Перемещение срезов в Go часто предполагает перестановку их элементов. Попытка напрямую переместить элемент из одной позиции в другую может привести к неожиданным результатам, как показано в предоставленном фрагменте кода:

slice := []int{0,1,2,3,4,5,6,7,8,9}

indexToRemove := 1
indexWhereToInsert := 4

slice = append(slice[:indexToRemove], slice[indexToRemove 1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)

Этот подход предполагает перемещение элемента из indexToRemove в indexWhereToInsert, но на выходе отображаются две копии перемещенного элемента. Ошибка заключается в способе удаления и вставки элемента. Давайте рассмотрим альтернативный подход:

Использование пользовательских функций для манипулирования элементами

Вместо того, чтобы вручную изменять срез, мы можем создать специальные функции для вставки и удаления:

func insertInt(array []int, value int, index int) []int {
    return append(array[:index], append([]int{value}, array[index:]...)...)
}

func removeInt(array []int, index int) []int {
    return append(array[:index], array[index 1:]...)
}

Точное перемещение элементов

С помощью этих вспомогательных функций перемещение элемента становится простым:

func moveInt(array []int, srcIndex int, dstIndex int) []int {
    value := array[srcIndex]
    return insertInt(removeInt(array, srcIndex), value, dstIndex)
}

Пример реализации и вывода

func main() {
    slice := []int{0,1,2,3,4,5,6,7,8,9}

    fmt.Println("Original slice:", slice)

    slice = insertInt(slice, 2, 5)
    fmt.Println("After insertion:", slice)

    slice = removeInt(slice, 5)
    fmt.Println("After removal:", slice)

    slice = moveInt(slice, 1, 4)
    fmt.Println("After moving:", slice)
}

Вывод:

Original slice: [0 1 2 3 4 5 6 7 8 9]
After insertion: [0 1 2 3 4 2 5 6 7 8 9]
After removal: [0 1 2 3 4 5 6 7 8 9]
After moving: [0 2 1 3 4 5 6 7 8 9]

Этот подход правильно сдвигает элемент с индексом 1 на индекс 4, что приводит к ожидаемому результату.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3