Sort an arraylist of strings with following conditions?

joeyw :

I have an arraylist of strings in the form of:

{T1, C1, C2, T2, C3, T3, A1, T4, G1, A2, G2, A3, T5, C4, C5, T6, A4, T7, T8, C6, T9, A5, T10, G3, A6, A7, A8, C7, C8, T11, T12, C9, A9, $1, G4, A10, C10, C11, A11, A12, A13, A14, T13, T14, C12, T15, C13, C14, G5, G6, C15}

I want to sort this arraylist to the following:

{$1, A1, A2...A10, A11,... C1, C2...C14....}.

however, when I used Collections.sort(), the result turns out to be:

{$1, A1, A10, A11, A12, A13, A14, A2, A3, A4, A5, A6, A7, A8, A9, C1, C10, C11, C12, C13, C14, C15, C2, C3, C4, C5, C6, C7, C8, C9, G1, G2, G3, G4, G5, G6, T1, T10, T11, T12, T13, T14, T15, T2, T3, T4, T5, T6, T7, T8, T9}

with A2 comes after A14. So is there a way to solve this issue? Thanks so much!

Karol Dowbecki :

You can use Comparator.comparing() method chain to define the sort criteria. Define the first comparison as Character sort on the first character and then define the second comparison as Integer sort on the remaining sub-string:

String[] arr = {"T1", "C1", "C2", "T2", "C3", "T3", "A1", "T4", "G1", "A2", "G2", "A3", "T5",
    "C4", "C5", "T6", "A4", "T7", "T8", "C6", "T9", "A5", "T10", "G3", "A6", "A7", "A8", "C7",
    "C8", "T11", "T12", "C9", "A9", "$1", "G4", "A10", "C10", "C11", "A11", "A12", "A13",
    "A14", "T13", "T14", "C12", "T15", "C13", "C14", "G5", "G6", "C15"};
Arrays.sort(arr, Comparator.<String, Character>comparing(s -> s.charAt(0))
    .thenComparingInt(s -> Integer.parseInt(s.substring(1))));
System.out.println(Arrays.toString(arr));

will print

[$1, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, G1, G2, G3, G4, G5, G6, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=94587&siteId=1