我有一个数组,其中每个元素也是一个数组,我想按它们的第一个元素将这些数组在数组中排序。在Julia中是否可能实现这样的操作?
例如,我有:
a = (Array{Int64, 1})[]
push!(a, [5, 2 , 3])
push!(a, [3, 1 , 4])
我希望您能按照每个数组的第一个元素排序,使结果为
[[3,1,4], [5,2,3]
。这是因为在Julia中,堆无法将数组作为元素添加到堆中。有任何想法吗?1.0版本更新说明:
sort(a)
这就是全部。Julia版本1.0为数组定义了<
作为我下面描述的词典排序,因此您不再需要手动指定它。
0.6之前的答案
您可以将自定义的lt
(小于)运算符作为sort
的关键字参数进行指定:(文档链接)
julia> sort(a, lt=(x,y)->isless(x[1], y[1]))
2-element Array{Array{Int64,1},1}:
[3,1,4]
[5,2,3]
更普遍地,您可以使用lexless
以词典顺序稳健地对数组进行排序:
julia> push!(a, [5, 1, 1])
3-element Array{Array{Int64,1},1}:
[5,2,3]
[3,1,4]
[5,1,1]
julia> sort(a, lt=lexless)
3-element Array{Array{Int64,1},1}:
[3,1,4]
[5,1,1]
[5,2,3]
ord
参数来指定词典序排序:Collections.heapify(a, Base.Order.Lexicographic)
。 - mbaumanCollections.heappush!(v, x[, ord])
函数是否也能维护堆顺序呢?并且,是否可以用它将数组添加到堆中呢?例如,像这样Collections.heappush!(a,[5,2,3])
?我尝试了很多变化,但都没有成功。 - M.PukCollections.heappush!(a, [10, 1 , 4])
添加元素,但没有成功。在你建议试用heapify后,我尝试了Collections.heappush!(a, [10, 1 , 4], Base.Order.Lexicographic)
,它成功了,非常感谢你的建议。但是,Lexicographic是基于字母表排序的,对吗?有可能使用这个函数进行排序:lt=(x,y)->isless(x[1], y[1])
? - M.Puklt
比较函数,你可以使用Base.Order.ord((x,y)->isless(x[1], y[1]), identity, false)
构建自定义排序。 - mbauman
sort(a,by=first)
是有效的(first
是一个有用的函数需要记住)。 - Dan Getz