英文:
Remove duplicate from response
问题
我有以下任务:我正在创建一个循环,向服务器发送请求并接收一个值,例如一个整数切片。然后我需要将这个整数切片传递给另一个任务。问题是有时我会从服务器接收到重复的值,例如:
resp1 := []int{1,2,3,4} // 做一些操作
resp2 := []int{3,4,5,6} // 做一些操作
但我希望只将响应中的新值传递给下一个任务:
resp1 := []int{1,2,3,4} // 传递 1,2,3,4
resp2 := []int{3,4,5,6} // 传递 5,6
有没有办法避免/清除值中的重复项?
英文:
I have the following task: I'm making loop that doing requests to server and recieving a value, for example it is a slice of ints. Then I need to pass this slice of ints to another task. The thing is that sometime I recieve duplicate value from server, for example:
resp1 := []int{1,2,3,4} > do some things
resp2 := []int{3,4,5,6} > do some things
But I want to pass only NEW values from response to next task
resp1 := []int{1,2,3,4} > pass 1,2,3,4
resp2 := []int{3,4,5,6} > pass 5,6
Is there any solution to avoid / "clean up" duplicates from value?
答案1
得分: 2
一般的想法是维护一个全局的“切片映射”(如mkopriva在评论中建议的),它会记录你传递给其他任务的任何值。
还要构建一个新的切片,它会:
- 对于全局映射中的每个值'x'(来自
respx
)进行测试:- 如果存在,你的新切片将不包括该值
- 如果不存在,你的新切片将包括该值(并且一个空的结构值将被添加到全局映射中,以'x'作为键)
- 将新切片(只包含新值,之前从未传递过的值)传递给新任务
关键是:你当前的任务是有状态的,并且需要在每次调用之间保持状态。
你将需要一些形式的全局变量和/或单例模式,即在程序执行期间持续存在的东西。
mkopriva还提到了“visited模式”作为实现示例。
英文:
The general idea would be to maintain a global <del>slice</del> map (as suggested by mkopriva in the comments) which would memorize any value you are passing to your other task.
Build also a new slice which would:
- test for each value 'x' (of
respx
) in the global map:- if present, your new slice would not include that value
- if absent, your new slice would include that value (and an empty struct value would be added to your global map, with 'x' as key)
- pass the new slice (with only new values, never passed before) to the new task
The point is: your current task is stateful and need to maintain a state between each call.
You will need some kind of global variable and/or singleton, something which will span the life of the execution of your program.
mkopriva also mentions the "visited pattern" as implementation examples.
答案2
得分: 1
你可以使用一个映射(map)来存储已经出现过的值,并且通过这个映射来生成每次获取响应时的唯一值。一个获取唯一响应的函数可以像这样:
func getUniqueResponse(curResp []int, seen map[int]bool) []int {
var resp []int
for _, num := range curResp {
if !seen[num] {
seen[num] = true
resp = append(resp, num)
}
}
return resp
}
你可以声明一个 map[int]bool
,并将该映射与切片一起传递,以获得一个唯一的切片。
seen := make(map[int]bool)
resp := []int{1, 2, 3, 4}
uniqueResp := getUniqueResponse(resp, seen)
// 使用唯一响应进行其他操作
resp = []int{3, 4, 5, 6}
uniqueResp = getUniqueResponse(resp, seen)
// 使用唯一响应进行其他操作
请注意,以上代码是使用Go语言编写的。
英文:
You can store the values you have already seen in a map and using that you can generate unique values each time you get a response. A function to get unique response can be like this :
func getUniqueResponse(curResp []int, seen map[int]bool) []int {
var resp []int
for _, num := range curResp {
if !seen[num] {
seen[num] = true
resp = append(resp, num)
}
}
return resp
}
You can declare a map[int]bool
and pass that map along with slice and receive a unique slice.
seen := make(map[int]bool)
resp := []int{1, 2, 3, 4}
uniqueResp := getUniqueResponse(resp, seen)
// Do other work with unique Response
resp = []int{3, 4, 5, 6}
uniqueResp = getUniqueResponse(resp, seen)
// Do other work with unique Response
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论