在java中使用比较器的几个特性

时间:2016-08-23 08:32:28

标签: java sorting comparator

我有一个要排序的列表,但如果值表示为字符串则无法完成。例如:

NSLocalizedString

因此,我需要使用比较器来首先按照其载体(OB)对OB123这样的飞机编号进行分类,而不是使用它们的编号(123)和有时后缀("")。在那之后,我想将整个名称与所有其余值进行比较,作为"每日检查"等等 到目前为止,我只能对航班ID进行排序:

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

因此,"每日检查"还有载体+数字+后缀表示,它根据它排序。问题是如何根据他们的名字对它们进行排序。

2 个答案:

答案 0 :(得分:1)

好吧,你可以对字符串中的数字进行比较检查:

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

测试它

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);
    }
}

<强>输出

Daily check
Maintenance
OB123
OB123
OB1212

声明

现在,虽然这些数据对于您的要求似乎是正确的,但这不是您问题的真正答案。此外,如果航班信件不同,即OM1212,OR1212,这将仅比较数字,所以要立即解决您的问题,您可以选择

  • 使用此Comparator并比较显示的数据(不使用属性)
  • 将此Comparator<String>改为Comparator<Flight> (最佳选项)

<强> CREDITS

答案 1 :(得分:0)

您可以在另一个列表中提取运营商信息,您可以使用parseInt()通过整数解析它,然后对其进行排序。

稍后您可以合并两个列表。