创建多级优先队列更好的写法?

想创建三个优先队列放入一个数组中,还有没有更好更简洁的写法?

using DataStructures: PriorityQueue

PQTable = Array{PriorityQueue, 1}

pq_table = PQTable()
for i in 1:3
    push!(pq_table, PriorityQueue{String, Int}(Base.Order.Reverse))
end

数据结构这一块我不太懂,不过看起来直接用list comprehension 就可以了

pq_table = [ PriorityQueue{String, Int}(Base.Order.Reverse) for _ in 1:3 ]
1 个赞

repeat

julia> repeat([PriorityQueue{String,Int}(Base.Order.Reverse)], 3)
3-element Array{PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}},1}:
 PriorityQueue()
 PriorityQueue()
 PriorityQueue()
1 个赞

这个是有问题的

julia> qs = repeat([PriorityQueue{String,Int}(Base.Order.Reverse)], 3)
3-element Array{PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}},1}:
 PriorityQueue()
 PriorityQueue()
 PriorityQueue()

julia> push!(qs[1], "a" => 2)
2

julia> qs
3-element Array{PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}},1}:
 PriorityQueue("a" => 2)
 PriorityQueue("a" => 2)
 PriorityQueue("a" => 2)

因为repeat只是复制了引用,所以它们指向的是同一个队列;修改一个,其他的也跟着在变

1 个赞

!!!
:yum: 没主意到

不把我的代码po出来,永远不知道自己有多菜 :joy:

1 个赞

如果能给社区提PR(修bug或者加demo)的话,其实是能得到很多这方面的反馈和锻炼的。

emmm 大概就是一种 “我帮你做一些杂事,你给我一些指导” 的交换,而且代码库的维护者在不忙的情况下会很愿意给出建议和说明。比如说有个刚接触 Images.jl 不久的同学在 https://github.com/JuliaImages/juliaimages.github.io/pull/146 这里就只是补充了一部分文档,然后 我和 TimHoly 就给了远超过他工作量的反馈。

1 个赞

列表推导的和我提的长版本有点区别就是 语义 不太一样

这是我一开始写的 pq_table:

# 我可以在里面放入不同类型的队列
julia> push!(pq_table, PriorityQueue{Int, String}())
4-element Array{PriorityQueue,1}:
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
 PriorityQueue{Int64,String,Base.Order.ForwardOrdering}()

用列表推导的话,只能放这一种特定类型的

julia> pq_table
3-element Array{PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}},1}:
 PriorityQueue("12" => 3,"1" => 2)
 PriorityQueue()
 PriorityQueue()

当然这两种语义虽然有点区别,但使用效果相同,不影响。

这种情况下的话,在[] 前面加上类型标记就好了:

julia> pq_table = PriorityQueue[ PriorityQueue{String, Int}(Base.Order.Reverse) for _ in 1:3 ]
3-element Array{PriorityQueue,1}:
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
 PriorityQueue{String,Int64,Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}}()
1 个赞

我也愿意!做些翻译什么么?

就找自己熟悉的领域的工具箱就好了呀。看你之前提的问题似乎是对文本解析感兴趣,那兴许可以给小红同学:smiley: @thautwarm 的 MLStyle 提供一些demo