我最近一直在搞乱Go,我想看看如何从二维切片中删除一个元素。
为了从一维切片中删除元素,我可以成功使用:
data = append(data[:i], data[i+1:]...)
然而,使用二维切片,使用:
data = append(data[i][:j], data[i][j+1:]...)
抛出错误:
cannot use append(data[i][:j], data[i][j+1:]...) (type []string) as type [][]string in assignment
解决这个问题需要采用不同的方法吗?
答案 0 :(得分:3)
Go中的2D切片只不过是一片切片。因此,如果要从此2D切片中删除元素,实际上您仍然只需要从切片中移除元素(这是另一个切片的元素)。
没有更多的参与。您唯一需要注意的是,当您从行切片中删除元素时,结果将只是“外部”切片的行(元素)的“新”值,而不是2D切片本身。因此,您必须将结果分配给外部切片的元素,以及刚刚删除其元素的行:
// Remove element at the ith row and jth column:
s[i] = append(s[i][:j], s[i][j+1:]...)
请注意,如果我们将s[i]
替换为a
,这与简单的“从切片中移除”相同(不出所料,因为s[i]
表示“行切片”,其jth
1}}我们要删除的元素:
a = append(a[:j], a[j+1:]...)
见完整的例子:
s := [][]int{
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
}
fmt.Println(s)
// Delete element s[1][2] (which is 6)
i, j := 1, 2
s[i] = append(s[i][:j], s[i][j+1:]...)
fmt.Println(s)
输出(在 Go Playground 上试试):
[[0 1 2 3] [4 5 6 7] [8 9 10 11]]
[[0 1 2 3] [4 5 7] [8 9 10 11]]
答案 1 :(得分:1)
以下是 Go Playground 的可能方法之一。
b := [][]int{
[]int{1, 2, 3, 4},
[]int{5, 6, 7, 8},
[]int{9, 0, -1, -2},
[]int{-3, -4, -5, -6},
}
print2D(b)
i, j := 2, 2
tmp := append(b[i][:j], b[i][j+1:]...)
c := append(b[:i], tmp)
c = append(c, b[i+1:]...)
print2D(c)
基本上我正在提取i-th
行,从中移除元素append(b[i][:j], b[i][j+1:]...)
,然后将这行放在行之间。
如果有人会告诉你如何附加许多元素,那么它看起来会更好。