有没有一种方法可以编写通用的数组/切片重复数据删除,因为[]int
我们可以有一些类似的东西(来自http://rosettacode.org/wiki/Remove_duplicate_elements#Go):
func uniq(list []int) []int {
unique_set := make(map[int] bool, len(list))
for _, x := range list {
unique_set[x] = true
}
result := make([]int, len(unique_set))
i := 0
for x := range unique_set {
result[i] = x
i++
}
return result
}
但是有没有办法扩展它以支持任何数组?签名如下:
func deduplicate(a []interface{}) []interface{}
我知道您可以使用该签名编写该函数,但是您实际上不能在上使用它[]int
,您需要创建一个[]interface{}
put命令,将所有内容都[]int
放入其中,然后将其传递给函数,然后再将其放回a
[]interface{}
和经历这个新的数组并将所有内容都放在一个新的[]int
。
我的问题是, 有更好的方法吗?
尽管VonC的答案可能与您真正想要的最接近,但在没有gen的本机Go中实现此目的的唯一真实方法是定义一个接口
type IDList interface {
// Returns the id of the element at i
ID(i int) int
// Returns the element
// with the given id
GetByID(id int) interface{}
Len() int
// Adds the element to the list
Insert(interface{})
}
// Puts the deduplicated list in dst
func Deduplicate(dst, list IDList) {
intList := make([]int, list.Len())
for i := range intList {
intList[i] = list.ID(i)
}
uniques := uniq(intList)
for _,el := range uniques {
dst.Insert(list.GetByID(el))
}
}
uniq
您的OP的功能在哪里。
这只是一个可能的示例,可能还有很多更好的示例,但是通常将每个元素映射到唯一的“ == able”
ID并基于ID的重复数据删除构建新列表或剔除可能是最直观的方式。
另一种解决方案是采用接口正好位于的[]IDer
位置。但是,这意味着 用户* 代码必须创建[]
IDer列表并将所有元素复制到该列表中,这有点难看。对于用户而言,将列表包装为ID列表而不是副本是比较干净的方法,但这两种方法的工作量都差不多。IDer``ID() int
*
问题内容: 在我的编程任务中,我被要求编写一种通用的复制方法,以从一个数组复制到相同大小和类型的数组。在Java中甚至可能吗?我尝试的所有操作最终都出现了一些“通用数组创建”错误。我迷路了,不知道如何解决这个问题! 问题答案: 您可以使用反射的概念来编写可在运行时确定类型的通用复制方法。简而言之,反射就是在运行时检查类,接口,字段和方法而无需在编译时知道类,方法等名称的能力。 java.lang.
我有这个数组 因为我只想渲染前5张照片。。如何从阵列中获取前5张照片??
问题内容: 我使用下面的代码行遍历数据库中的一个表: 如果我打印出数组: 我会得到这个: 但是我想摆脱数组中的重复项,所以我使用 我得到下面的奇怪结果,这不是我想要的结果: 理想情况下,我认为它应该返回以下内容: 我该怎么做才能正确处理?我使用了错误的PHP语法/默认功能吗? 问题答案: 该功能将为您完成此操作。您只需要添加标志:
问题内容: 这似乎是这将是整个interwebs一个相当普遍的事情,丰富的实例,但我似乎无法找到如何将一个转换的例子来。 我有一个从外部lib调用的函数,该函数返回一个数组 然后,我需要将该结果传递给其他函数以进行进一步处理。 不幸的是,如果我尝试致电 我懂了 在做 好多了。我该怎么做,尤其是在不创建数据副本的情况下(当我正在做的事情是传递数据时,似乎很愚蠢地复制该数据)。 问题答案: 这应该工作
我有一个问题编码这个: 编写一个名为的静态方法,该方法将整数数组作为输入,并返回一个新的整数数组,其中所有重复项都被删除。例如,如果输入数组具有元素{4,3,3,4,5,2,4},则结果数组应为{4,3,5,2} 这是我目前所做的
我有一个这样的专栏: 我希望专栏看起来像这样: 只希望保留重复记录的第一个或最后一个。 目前,我使用的是: 但它不起作用。我错过了什么吗?