3

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
  • 43,645
  • 9
  • 78
  • 111
joeyw
  • 41
  • 2
  • 1
    You're getting that result because Collections.sort() in this case is sorting alphabetically, you will have to write a custom Comparator to achieve a different sorting. Here are some examples: https://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/ https://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property – LZR Nov 29 '18 at 21:31

2 Answers2

4

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]
Karol Dowbecki
  • 43,645
  • 9
  • 78
  • 111
0

You must make an own Comparator object for sorting in another order than default. Strings are sorted in lexicogrphic order when you do not supply an own comparator. Instead of Collection.sort you can use the new method of List.

myList.sort(new MyComparator());

The class MyComparator is an instance of Comparator:

class MyComparator implements Comparator<String> {
   ...
}

You have to implement the method compareTo.

Donat
  • 4,157
  • 3
  • 11
  • 26