これを行う方法はいくつか考えられます。
適切な方法
ステップ 1 - 文字列の使用をやめる。あなた自身の承認により、この文字列には「複数の変数タイプが含まれています」。これは文字列ではなく、クラスです (文字列は一連の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
、トークン化、トークンの int への変換などにより、文字列形式に適したものに変換します。
具象型のさまざまなフィールドを持つ実際のクラスができたので、これらのフィールドの 1 つまたは複数による並べ替えについて適切に考えることができます。これを行うには 2 つの方法があります。
まず、この順序でソートするメソッドをクラスに実装Comparable
して定義することができます。compare
これは、インスタンスの「自然な順序」である場合にのみ意味があります。ほとんどの状況でデフォルトの並べ替えとして意味のあるもの。
それ以外の場合は、 の独自のインスタンスを定義して、Comparator<MyFoo>
好きな順序でオブジェクトを並べ替えることができます。上記の私のクラスを使用した例は次のようになります。
Comparator<MyFoo> cmp = new Comparator<MyFoo>() {
public int compare(MyFoo a, MyFoo b) {
return b.secondNum - a.secondNum;
}
}
ハッキーな方法
Comparator<String>
各文字列の「2 番目の 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);
}
}
この方法は、これらの文字列を 1 回だけ使用して並べ替えてから破棄する場合には、より理にかなっている可能性があります。そのため、完全なオブジェクトを構築するメリットはほとんどありません。