我可以想到几种方法来做到这一点。
正确的方式
第一步 - 停止使用字符串。你自己承认,这个字符串“包含多种变量类型”。那不是字符串,它是一个类(字符串只是char
s 的序列)。实际上这样表示它不仅会使这种情况更容易(并且更不容易出错),而且会在您需要使用它们的任何其他地方支付类似的红利。
因此,定义一些封装所涉及的数据类型的类,例如:
public class MyFoo {
final int firstNum;
final String firstDesc;
final int secondNum;
final String secondDesc;
final boolean trueFalseBit;
// Constructor, equals, hashcode etc. elided
}
然后,每当您第一次获得像str1
传递到系统中的字符串时,通过标记化将其转换为实例MyFoo
,将标记转换为整数等 - 适合字符串格式的任何内容。
现在您已经有了一个具有不同具体类型字段的实际类,您可以正确地考虑按这些字段中的一个或多个进行排序。那么有两种方法可以做到这一点。
首先,您可以让您的类实现Comparable
并定义一个compare
按此顺序排序的方法。只有当这是您的实例的“自然排序”时,这才真正有意义;在大多数情况下,作为默认排序是有意义的。
否则,您可以定义自己的 实例Comparator<MyFoo>
,它使用您喜欢的任何顺序对对象进行排序。使用我上面的类的一个例子可能是:
Comparator<MyFoo> cmp = new Comparator<MyFoo>() {
public int compare(MyFoo a, MyFoo b) {
return b.secondNum - a.secondNum;
}
}
骇客之道
只需编写一个自定义Comparator<String>
来提取每个字符串的“第二个 int”,并相应地对它们进行排序。如果要将这些字符串转换为类,这将类似于您将使用的解析代码 - 可能类似于:
Comparator<String> cmp = new Comparator<String>() {
private int getSecondInt(String s) {
String[] parts = s.split(" ");
// TODO check length is at least 3
return Integer.parseInt(parts[2]);
// TODO handle exceptions
}
public int compare(String a, String b) {
return getSecondInt(b) - getSecondInt(a);
}
}
如果您只是使用这些字符串一次进行排序然后将它们丢弃,那么这种方式可能更有意义 - 因此构建完整对象几乎没有什么好处。