Scenario
I have a list I’m getting back where I have a mixture of letters and numbers as strings. I need the list to be sorted so it’s alphabetic first THEN numeric.
# Sample data
[
{"1",[]},
{"A",[]},
{"B",[]},
{"C",[]},
{"D",[]},
{"E",[]},
{"F",[]},
{"3",[]},
{"4",[]},
{"5",[]},
{"6",[]}
]
# But I want this as the final result
[
{"A", []},
{"B", []},
{"C", []},
{"D", []},
{"E", []},
{"F", []},
{"1", []},
{"3", []},
{"4", []}
]
My solution works
This is what I came up with and it seems to work
defmodule Foo do
@list [
{"1",[]},
{"A",[]},
{"B",[]},
{"C",[]},
{"D",[]},
{"E",[]},
{"F",[]},
{"3",[]},
{"4",[]},
{"5",[]},
{"6",[]}
]
def list do
@list
end
def sort_alpha_then_numeric(list) do
numbers_alpabetic_list =
Enum.split_with(list, fn item ->
{key, _value} = item
case Integer.parse(key) do
{_, ""} -> true
:error -> false
end
end)
{number_list, alpha_list} = numbers_alpabetic_list
# We now switch it so that the order is alpabetic then numeric
List.flatten(alpha_list, number_list)
end
end
So if I try this out
Foo.sort_alpha_then_numeric Foo.list
# returns
[
{"A", []},
{"B", []},
{"C", []},
{"D", []},
{"E", []},
{"F", []},
{"1", []},
{"3", []},
{"4", []}
]
Question
It works, but would like to know if my approach can be improved and learn something about sorting. Thanks.