我有一个要排序的列表,但如果值表示为字符串则无法完成。例如:
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
因此,"每日检查"还有载体+数字+后缀表示,它根据它排序。问题是如何根据他们的名字对它们进行排序。
答案 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 强>
getNumber
containsNumber
答案 1 :(得分:0)
您可以在另一个列表中提取运营商信息,您可以使用parseInt()
通过整数解析它,然后对其进行排序。
稍后您可以合并两个列表。