在Java中使用比较器的几个特性 [英] Using comparator for several characteristics in java

查看:84
本文介绍了在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

因此,我需要使用比较器来首先按照航空母舰的编号(OB)而不是航空母舰的编号(123)有时是后缀(")对诸如OB123的航空器编号进行排序.然后,我想将整个名称与所有其他值进行比较,例如每日检查"等. 到目前为止,我只能对航班ID进行排序:

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.

推荐答案

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

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

FlightComparator.java

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,则会仅比较数字,因此要立即解决问题,您可以选择


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

  • 使用此Comparator并比较显示的数据(不使用属性)
  • 将此Comparator<String>调整为Comparator<Flight> (最佳选择)
  • use this Comparator and compare data as shown (not using attributes)
  • adapt this Comparator<String> to Comparator<Flight> (best option)

信用

这篇关于在Java中使用比较器的几个特性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆