按Julia中的多个元素对向量的向量进行排序

时间:2018-06-29 09:03:31

标签: sorting vector julia

我已经很好地阅读了Julia手册的“排序功能”部分,并了解了此板上已经提出的一些类似问题,但我认为我还没有找到了我问题的答案。抱歉,如果我错过了什么。

基本上,我有一个向量向量,其中包含的向量包含整数。出于示例的目的,每个封闭的向量都包含3个整数,但是它可以是任何数字。我想按第一个元素,然后按第二个元素,然后按第三个元素,等等对封闭的向量进行排序。

让我们从向量开始吧:

v = [[3, 6, 1], [2, 2, 6], [1, 5, 9], [2, 1, 8], [3, 7, 9],
    [1, 1, 2], [2, 2, 2], [3, 6, 2], [1, 2, 5], [1, 5, 6],
    [3, 7, 4], [2, 1, 4], [2, 2, 1], [3, 1, 2], [1, 2, 8]]

继续我真正想要的东西:

v = [[1, 1, 2], [1, 2, 5], [1, 2, 8], [1, 5, 6], [1, 5, 9], 
    [2, 1, 4], [2, 1, 8], [2, 2, 1], [2, 2, 2], [2, 2, 6], 
    [3, 1, 2], [3, 6, 1], [3, 6, 2], [3, 7, 4], [3, 7, 9]]

因此对火箭科学没有任何要求。

我可以通过以下两种方式之一轻松地按封闭向量的第一个元素对向量进行排序:

v = sort(v, lt = (x, y) -> isless(x[1], y[2]))

或:

v = sort(v, by = x -> x[1])

这两种方法都会产生相同的答案:

v = [[1, 5, 9], [1, 1, 2], [1, 2, 5], [1, 5, 6], [1, 2, 8],
    [2, 2, 6], [2, 1, 8], [2, 2, 2], [2, 1, 4], [2, 2, 1], 
    [3, 6, 1], [3, 7, 9], [3, 6, 2], [3, 7, 4], [3, 1, 2]]

因此,正如您所看到的,我已按包含向量的第一个元素进行排序,但未按后续元素进行排序。

那么,回到标题中的问题,有没有一种使用sort()函数对多个元素进行排序的方法?

我实际上可以使用循环得到想要的东西:

for i = 3:-1:1
    v = sort(v, lt = (x, y) -> isless(x[i], y[i]))
end

或:

for i = 3:-1:1
    v = sort(v, by = x -> x[i])
end

但是,我不想重新发明轮子,因此,如果我想在sort()函数中有办法做到这一点,

1 个答案:

答案 0 :(得分:5)

您可以将lexless函数用作lt关键字参数,如果我正确理解了您的问题,它就会完全满足您的要求:

julia> sort(v, lt=lexless)
15-element Array{Array{Int64,1},1}:
 [1, 1, 2]
 [1, 2, 5]
 [1, 2, 8]
 [1, 5, 6]
 [1, 5, 9]
 [2, 1, 4]
 [2, 1, 8]
 [2, 2, 1]
 [2, 2, 2]
 [2, 2, 6]
 [3, 1, 2]
 [3, 6, 1]
 [3, 6, 2]
 [3, 7, 4]
 [3, 7, 9]

编辑:我刚刚检查了这是Julia 0.6的解决方案。在Julia 0.7中,您可以简单地编写:

julia> sort(v)
15-element Array{Array{Int64,1},1}:
 [1, 1, 2]
 [1, 2, 5]
 [1, 2, 8]
 [1, 5, 6]
 [1, 5, 9]
 [2, 1, 4]
 [2, 1, 8]
 [2, 2, 1]
 [2, 2, 2]
 [2, 2, 6]
 [3, 1, 2]
 [3, 6, 1]
 [3, 6, 2]
 [3, 7, 4]
 [3, 7, 9]