我有一大堆[TestMethod]
public void SaveCategoriesAsync_When_Then()
{
A.CallTo(() => this.articleRepository.GetArticles(A<IList<long>>._)).Returns(new List<ArticleModel>());
Func<Task> func = async () => await this.testee.SaveCategoriesAsync(new List<int>());
func.ShouldThrow<Exception>();
}
s,看起来都像这样
Dict
我需要按{
"id": 12345,
"user_id": "6789",
"question_id": "some_question_id",
"correct": "true",
"actions": "...",
"consequentiality": 0,
"timestamp": 1505123456.000
}
对(question_id, user_id, id, consequentiality)
进行排序,question_id
移动速度最慢,consequentiality
移动速度更快 - 如果愿意,可以分组和分组,但我需要在某些情况下对有序数组执行交换,其中大多数往往发生在组之间。我一直在玩Base.sort
,将不同的功能传递给by
和lt
。我想出的最好的方法是将多个排序组合在一起,并将不同的密钥传递给每个by
子句,如
sort(sort(sort(sort(df, by=x->x["question_id"]), by=x->x["user_id"] ...
你得到了照片。到目前为止,即使使用MergeSort
等稳定算法,我也无法达到令人满意的稳定排序。
帮助?
编辑在by
子句中使用元组是否有意义?但是,如何反转非数字元素的排序?
答案 0 :(得分:1)
以下是在注释中使用lt=...
清除解决方案的方法的演示。请注意,这仅适用于元组,因为它为元组重新定义isless
。如果有热情,也许可以将这样的东西纳入朱莉娅或某些包装中。
julia> struct RevNext
end
julia> import Base: isless
julia> function isless(t1::Tuple, t2::Tuple)
n1, n2 = length(t1), length(t2)
reverse = false
for i = 1:min(n1, n2)
a, b = t1[i], t2[i]
if !isequal(a, b)
return reverse ? isless(b, a) : isless(a,b)
else
reverse = isa(a,RevNext)
end
end
return n1 < n2
end
WARNING: Method definition isless(Tuple, Tuple) ...
isless (generic function with 53 methods)
要使用它,我们会写sort(M,by=x->(x[:b], RevNext(), x[:a]))
。随机生成的向量M
的示例:
julia> M = [Dict(:a=>rand(),:b=>rand(Bool)) for i=1:10]
10-element Array{Dict{Symbol,Any},1}:
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.735352),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.537437),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.314947),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.9723),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.605042),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.256509),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.133487),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.320249),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.409549),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.421471),Pair{Symbol,Any}(:b, true))
julia> sort(M,by=x->(x[:b], RevNext(), x[:a]))
10-element Array{Dict{Symbol,Any},1}:
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.9723),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.320249),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.256509),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.133487),Pair{Symbol,Any}(:b, false))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.735352),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.605042),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.537437),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.421471),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.409549),Pair{Symbol,Any}(:b, true))
Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.314947),Pair{Symbol,Any}(:b, true))