Using comparator for several characteristics in java

你说的曾经没有我的故事 提交于 2019-12-13 10:17:59

问题


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:

@Override
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.


回答1:


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

FlightComparator.java

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+",""));
    }
}

TEST IT

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

private static void list(String[] ss) {
    for (String s : ss) {
        System.out.println(s);
    }
}

OUTPUT

Daily check
Maintenance
OB123
OB123
OB1212

DISCLAIMER

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)

CREDITS

  • Method getNumber created from this answer
  • Method containsNumber from this answer



回答2:


You can extract the carrier information in another List, there you can parse it by Integer using parseInt() and then sort it.

Later you can merge both lists.



来源:https://stackoverflow.com/questions/39096150/using-comparator-for-several-characteristics-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!