我有一个消息流进入 Go channel ,其中大部分看起来像:
T:添加包到图表:acl-devel/2.2.52_4/armv6l-musl
T:将包添加到图中:rofs-filtered/1.7_1/x86_64-musl
T:将包添加到图中:rofs-filtered/1.7_1/HOST
T:将包添加到图表:libshout/2.4.1_1/i686
T:将包添加到图中:mate-terminal/1.18.1_1/armv6l
T:将包添加到图中:bullet-devel/2.86.1_1/x86_64-musl
T:将包添加到图中:bullet-devel/2.86.1_1/HOST
T: 添加包到图表:cubietruck-uboot/2016.11_1/armv6l-musl
T: 添加包到图表:libfontenc/1.1.3_1/i686-musl
T:将包添加到图表:apk-tools/2.8.1_1/x86_64
T:将包添加到图形:virtualbox-ose/5.1.28_1/armv7l-musl
T:将包添加到图中:acl-devel/2.2.52_4/armv7l
T:将包添加到图表:apk-tools/2.8.1_1/x86_64-musl
T:将包添加到图表:tzutils/2017c_1/x86_64-musl
T:将包添加到图形:python-argh/0.26.2_1/noarch
T:将包添加到图表:tzutils/2017c_1/HOST
我希望能够有效地逐行组合上述字符串,但不丢失任何信息。这是为了打印到 IRC channel ,所以我不想触发洪水警告。为此,我想将上面的内容按摩成类似于下面的内容:
T: 添加包到图表:rofs-filtered/1.7_1/{x86_64-musl,HOST}
T:将包添加到图表:libshout/2.4.1_1/i686
T:将包添加到图中:mate-terminal/1.18.1_1/armv6l
T:将包添加到图中:bullet-devel/2.86.1_1/{x86_64-musl,HOST}
T: 添加包到图表:cubietruck-uboot/2016.11_1/armv6l-musl
T: 添加包到图表:libfontenc/1.1.3_1/i686-musl
T: 添加包到图表:apk-tools/2.8.1_1/{x86_64,x86_64-musl}
T:将包添加到图形:virtualbox-ose/5.1.28_1/armv7l-musl
T: 添加包到图表:acl-devel/2.2.52_4/{armv6l-musl,armv7l}
T:将包添加到图表:tzutils/2017c_1/{x86_64-musl,HOST}
T:将包添加到图形:python-argh/0.26.2_1/noarch
虽然仍然有很多输出和消息,但报告的大部分内容大约为 10-12 行,带有上述公共(public)前缀,散布在执行上述操作的多个线程的输出中(因此上述数据中的重复次数很少,很多线程和数据是大约 2 秒的快照)。
我如何在 Go 中压缩多行以沿着它们的公共(public)前缀连接?
最佳答案
这是一种可能的解决方案。如果需要,您可以在 append() 命令之前检查重复项。
https://play.golang.org/p/XodCgl1fa5
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
input := `T: added package to graph: acl-devel/2.2.52_4/armv6l-musl
T: added package to graph: rofs-filtered/1.7_1/x86_64-musl
T: added package to graph: rofs-filtered/1.7_1/HOST
T: added package to graph: libshout/2.4.1_1/i686
T: added package to graph: mate-terminal/1.18.1_1/armv6l
T: added package to graph: bullet-devel/2.86.1_1/x86_64-musl
T: added package to graph: bullet-devel/2.86.1_1/HOST
T: added package to graph: cubietruck-uboot/2016.11_1/armv6l-musl`
m := make(map[string][]string)
s := bufio.NewScanner(strings.NewReader(input))
for s.Scan() {
t := s.Text()
i := strings.LastIndex(t, "/")
p := t[:i+1]
last := t[i+1 : len(t)]
m[p] = append(m[p], last)
}
for k, v := range m {
fmt.Print(k, "{", strings.Join(v, ","), "}", "\n")
}
}
关于arrays - 组合公共(public)前缀子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47406468/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
给定一个数组a,什么是实现其组合直到第n的最佳方法?例如:a=%i[abc]n=2#Expected=>[[],[:a],[:b],[:c],[:a,b],[:b,:c],[:c,:a]] 最佳答案 做如下:a=%w[abc]n=30.upto(n).flat_map{|i|a.combination(i).to_a}#=>[[],["a"],["b"],["c"],["a","b"],#["a","c"],["b","c"],["a","b","c"]] 关于ruby-最多n的组合,我
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at