如何在字符串数组golang上实现删除范围?
How to implement remove range on string array golang?
如何在 golang 中实现 RemoveRange
方法?它是 C# 中的一个方法,如图所示 here
我想在我的 hashCode
字符串数组和 return 新修改的数组上实现 RemoveRange
方法,如果可能的话,删除这些范围。
func removeRange(hashCode []string, idx int, count int) []string {
var temp []string
for i, s := range hashCode {
fmt.Println(i, s)
// confuse here on what to do
}
return temp
}
简单地将切片向上切片直到 idx
,跳过 count
个元素并将其余部分附加到第一次切片的结果中:
func removeRange(hashCode []string, idx int, count int) []string {
return append(hashCode[:idx], hashCode[idx+count:]...)
}
正在测试:
s := []string{"0", "1", "2", "3", "4", "5"}
fmt.Println(s)
s = removeRange(s, 1, 2)
fmt.Println(s)
哪些输出(在 Go Playground 上尝试):
[0 1 2 3 4 5]
[0 3 4 5]
注意:上面的实现不检查索引是否有效(是否在范围内)。否则,代码可能会崩溃。如果需要,请添加必要的检查。
注意#2:上面的实现修改了传递的切片的元素,返回的切片将共享参数的支持数组。如果你想避免这种情况,如果你想保持输入不变并为结果分配一个新的切片,那么这样做:
func removeRange(hashCode []string, idx int, count int) []string {
result := make([]string, 0, len(hashCode)-count)
result = append(result, hashCode[:idx]...)
result = append(result, hashCode[idx+count:]...)
return result
}
在 Go Playground 上试试这个。
在 golang 中,您根本不需要为此提供方法或函数。 Go 切片可以在适当的位置进行子切片和附加,这就是您可以快速轻松地从任何切片中删除子集的方法。
假设你想删除 2 个元素,从索引 2 开始,你只需写:
Sub := append(original [:2], original [4:]...)
这是如何工作的:
original[:2]
创建一个从 0 开始的 sub-slice,长度为 2 个元素(因此索引为 0 和 1)
append
因为对于第一部分,我们要添加切片的其余部分,减去我们想要 skip/remove 的范围
original[4:]
创建另一个 sub-slice,这次从索引 4 开始,到 original
结束的地方结束。就像我们没有在第一个 sub-slice 中明确提到 0 作为起点一样,通过不在此处指定元素的数量,golang 将只包含切片中所有剩余的元素。
...
因为 append
是一个可变参数函数(built-in,但你明白了),我们需要传入每个要附加的元素作为新参数。 ...
运算符扩展了 sub-slice 并将每个元素作为单独的参数传入。
因为我们将新的切片赋值给了一个新的变量,original
会保持不变,所以如果要覆盖切片,只要赋值给同一个变量即可。
注意我在 phone 上写了这个,所以标记和代码可能不太正确,但这至少应该回答你的问题
我已经使用 //
注释解释了代码,如果没有注释,代码是不言自明的。
package main
import (
"fmt"
"os"
)
func RemoveRange(s []string, index, count int) []string {
sLen := len(s)
// Similar semantics to match (similar) the behavior of
// C# implementation
switch {
case index < 0, count < 0: // arguments are not valid
fmt.Fprintln(os.Stderr, "error: argument out of range error")
return s
case index+count-1 >= sLen: // range results in exceeding the limit
fmt.Fprintln(os.Stderr, "error: argument error")
return s
}
// Create a slice p and pre-allocate the size required
// to store the resultant slice after removing range.
// Result := s[:] -> s[:index] + s[index+count:]
// Remove := s[index:index+count-1]
p := make([]string, 0, sLen-count)
p = append(p, s[:index]...)
p = append(p, s[index+count:]...)
return p
}
func main() {
s := []string{"0", "1", "2", "3", "4", "5"}
fmt.Println(s)
r := RemoveRange(s, 1, 3)
fmt.Println(r)
}
输出:
[0 1 2 3 4 5]
[0 4 5]
如何在 golang 中实现 RemoveRange
方法?它是 C# 中的一个方法,如图所示 here
我想在我的 hashCode
字符串数组和 return 新修改的数组上实现 RemoveRange
方法,如果可能的话,删除这些范围。
func removeRange(hashCode []string, idx int, count int) []string {
var temp []string
for i, s := range hashCode {
fmt.Println(i, s)
// confuse here on what to do
}
return temp
}
简单地将切片向上切片直到 idx
,跳过 count
个元素并将其余部分附加到第一次切片的结果中:
func removeRange(hashCode []string, idx int, count int) []string {
return append(hashCode[:idx], hashCode[idx+count:]...)
}
正在测试:
s := []string{"0", "1", "2", "3", "4", "5"}
fmt.Println(s)
s = removeRange(s, 1, 2)
fmt.Println(s)
哪些输出(在 Go Playground 上尝试):
[0 1 2 3 4 5]
[0 3 4 5]
注意:上面的实现不检查索引是否有效(是否在范围内)。否则,代码可能会崩溃。如果需要,请添加必要的检查。
注意#2:上面的实现修改了传递的切片的元素,返回的切片将共享参数的支持数组。如果你想避免这种情况,如果你想保持输入不变并为结果分配一个新的切片,那么这样做:
func removeRange(hashCode []string, idx int, count int) []string {
result := make([]string, 0, len(hashCode)-count)
result = append(result, hashCode[:idx]...)
result = append(result, hashCode[idx+count:]...)
return result
}
在 Go Playground 上试试这个。
在 golang 中,您根本不需要为此提供方法或函数。 Go 切片可以在适当的位置进行子切片和附加,这就是您可以快速轻松地从任何切片中删除子集的方法。
假设你想删除 2 个元素,从索引 2 开始,你只需写:
Sub := append(original [:2], original [4:]...)
这是如何工作的:
original[:2]
创建一个从 0 开始的 sub-slice,长度为 2 个元素(因此索引为 0 和 1)append
因为对于第一部分,我们要添加切片的其余部分,减去我们想要 skip/remove 的范围
original[4:]
创建另一个 sub-slice,这次从索引 4 开始,到original
结束的地方结束。就像我们没有在第一个 sub-slice 中明确提到 0 作为起点一样,通过不在此处指定元素的数量,golang 将只包含切片中所有剩余的元素。...
因为append
是一个可变参数函数(built-in,但你明白了),我们需要传入每个要附加的元素作为新参数。...
运算符扩展了 sub-slice 并将每个元素作为单独的参数传入。
因为我们将新的切片赋值给了一个新的变量,original
会保持不变,所以如果要覆盖切片,只要赋值给同一个变量即可。
注意我在 phone 上写了这个,所以标记和代码可能不太正确,但这至少应该回答你的问题
我已经使用 //
注释解释了代码,如果没有注释,代码是不言自明的。
package main
import (
"fmt"
"os"
)
func RemoveRange(s []string, index, count int) []string {
sLen := len(s)
// Similar semantics to match (similar) the behavior of
// C# implementation
switch {
case index < 0, count < 0: // arguments are not valid
fmt.Fprintln(os.Stderr, "error: argument out of range error")
return s
case index+count-1 >= sLen: // range results in exceeding the limit
fmt.Fprintln(os.Stderr, "error: argument error")
return s
}
// Create a slice p and pre-allocate the size required
// to store the resultant slice after removing range.
// Result := s[:] -> s[:index] + s[index+count:]
// Remove := s[index:index+count-1]
p := make([]string, 0, sLen-count)
p = append(p, s[:index]...)
p = append(p, s[index+count:]...)
return p
}
func main() {
s := []string{"0", "1", "2", "3", "4", "5"}
fmt.Println(s)
r := RemoveRange(s, 1, 3)
fmt.Println(r)
}
输出:
[0 1 2 3 4 5]
[0 4 5]