当前位置: 首页 > 面试题库 >

我们可以在go中编写通用数组/切片重复数据删除吗?

童琪
2023-03-14
问题内容

有没有一种方法可以编写通用的数组/切片重复数据删除,因为[]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} 这是我目前所做的

  • 我有一个这样的专栏: 我希望专栏看起来像这样: 只希望保留重复记录的第一个或最后一个。 目前,我使用的是: 但它不起作用。我错过了什么吗?