Help me implement a sorting method

sort
#1

I have something like

mutable struct Foo
    Data::Array{String, 1}
    Results:Array{Result,1}
end

Where

mutable struct Result
    Query::String
    Score::Float64
end

I want to be able to sort the contents of Foo by score but if score is equal alphabetically by Data. What would be the best way to do this? I found isless which can be defined for my own types, but is there a “swap” or similar function too? Since changing positions needs to be done in both arrays.

Thanks for any input.

Edit: There was a formatting error cutting of the struct declarations.

#2

Put it into a DataFrame and then sort based on the columns you want? I do this with panel data quite often.

sort(df,[:score, :data])
#3

Probably some code was cut off when you posted, please edit.

#4

Yes this might be a solution, making the type contain a dataframe instead of arrays. Is there any difference in efficiency between the two?

#5

Ops sorry, formatting fail. Fixed now.

#6

I don’t know exactly how to visualize your problem but if you can think of your observations as Data containing an identifier or key variable with associated (scalar) information Query and Score, then a DataFrame seems natural.

df = DataFrame(data=Data,query=Query,score=Score)
sort!(df,[:score, :data])

It is not necessary to do it this way of course. That’s the beauty of the language. You could roll your own using sortperm, for example.

1 Like
#7

Ah sortperm looks like a great solution actually, giving the correct position. You’re probably right that df could work if I just redefine the structure as well.

Exactly something I was looking for in the docs without finding it :slight_smile: