marti6addams marti6addams - 1 year ago 69
Java Question

Using comparator for several characteristics in java

I have a list to be sorted but it cannot be done if values are represented as strings. Example:

to sort: OB123, OB1212, Maintenance, Daily check, OB123
desired result: Daily check, Maintenance, OB123, OB123, OB1212
if values are strings result is: Daily check, Maintenance, OB1212, OB123,OB123

Therefore I need to use comparator to first sort aircraft numbers such OB123 by their carrier(OB), than by their number (123) and sometimes suffix (""). And after that I would like to compare the whole name with all the rest values as "daily check" etc.
So far I can sort only flight Ids:

public int compareTo(FlightNumberDisplay toCompare) {

int result = _carrier.compareTo(toCompare.getCarrier());
if (result == 0) {
result = _number.compareTo(toCompare.getNumber());
if (result == 0) {
result = _suffix.compareTo(toCompare.getSuffix());

return result;

So since "Daily check" has also carrier+number+suffix representation it is sorted according to it. The question is how to sort them according to their names.

Answer Source

Well, you can make a comparison checking for numbers in the strings:

public class FlightComparator implements Comparator<String> {
    public int compare(String arg0, String arg1) {
        // both have numbers, compare them
        if (containsNumber(arg0) && containsNumber(arg0)) {
            Integer i1, i2; 
            try {
                i1 = getNumber(arg0);
            } catch (NumberFormatException ex) {
                return 1;

            try {
                i2 = getNumber(arg1);
            } catch (NumberFormatException ex) {
                return -1;

            return i1.compareTo(i2); 
        } else {
            // no numbers
            return arg0.compareTo(arg1);

    private boolean containsNumber(String string) {
        return string.matches(".*\\d+.*");

    private Integer getNumber(String string) throws NumberFormatException {
        return Integer.parseInt(string.replaceAll("\\D+",""));


public static void main(String[] args) {
    String[] ss = {"OB123", "OB1212", "Maintenance", "Daily check", "OB123"};
    Collections.sort(Arrays.asList(ss), new FlightComparator());

private static void list(String[] ss) {
    for (String s : ss) {


Daily check


Now, while this data seems correct for what you ask, is not a real answer to your problem. Also if flight letters are different ie, OM1212, OR1212, this will only compare the numbers, so to complete solve your problem now, you can choose between

  • use this Comparator and compare data as shown (not using attributes)
  • adapt this Comparator<String> to Comparator<Flight> (best option)


Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download