私は、シェルコマンドのための純粋なJavaの代替を探しています:sort -V
。私は単純にプラグインすることができコンパレータクラスを探しています。 sort -V
コマンドは、単にバージョンのシステムでファイルをソートする(すなわち、3.2.0-11
が0.1より大きくない、3.2.0-1
より10大きいです)。のためのJavaの代替「ソート-V」
ありがとうございます!
私は、シェルコマンドのための純粋なJavaの代替を探しています:sort -V
。私は単純にプラグインすることができコンパレータクラスを探しています。 sort -V
コマンドは、単にバージョンのシステムでファイルをソートする(すなわち、3.2.0-11
が0.1より大きくない、3.2.0-1
より10大きいです)。のためのJavaの代替「ソート-V」
ありがとうございます!
初級:お使いのバージョン文字列が明確に定義されている場合、
があなたは異なる番号にそれを分割し、それらを直接比較することができます。
3.2.0-11は、あなたがSRCを比較するアレイにそれらを作ったと仮定すると4つのint型、3、2、0、11 3.2.0-1一方が3になる、2、0と1
なる[3 ] < DEST [3]、SRC [2] < DEST [2]、...あなたのコンパレータの内側とあなたが行われています。
これは、結果として生じるアレイ内の各エントリに(SRC [N])Integer.getIntegerを呼び出し、その後のstring.Split(「.-」)とあなたのケースで容易に行うことができます。
高度:今
あなたがこのの「アドバンス」バージョンをしたい場合、私はあなたにちょっとしたトリックを表示することができます。あなたの値を取り、単一の長いにそれらを組み合わせた場合 - このような何か:
long l=src[3] << (16 * 3) + src[2] << (16 * 2) + src[1] << (16 * 1) + src[0];
これを比較することができる単一の長いにすべての個々のフィールドを結合します。 (ちょっとした鋳造が必要で、最初のフィールドはバージョン#32767を超えることはできません。他のユーザーはすべて65535に行くことができます)
数字が255を超えないと確信できない場合は、
の素敵な部分 - の代わりに16の8とint型にパック(最初のものは127の上に行かない限り、または8までの7つの分野でバージョン番号を扱うことができるロング)のこのテクニックは、4つの比較から1つを取って、1つの値だけを持ち歩いているということです。
エキスパート:
「エキスパート」バージョンは、ところで、あなたは本当にそれが実現していますどのように気にしないように、クラス内のすべてのこれをラップすることです。このようなインターフェイスで何か:
class VersionNo implements Comparable {
public VersionNo(String version, File originalFileObject);
public int compareTo(VersionNo target);
public String toString();
public File getOriginalFileObject();
}
今、あなたはあなたのプログラムの中で何かを達成する実装したい任意の時間を変更してすることはできません - あなたも、別のコンパレータを考慮することが「必要」していない、これらがすべき自己尊重の順序付けられたデータ構造に挿入されたときに自動的にソートされます。
私はかつて一般的な「人間のような」コンパレータを書きました。私は表示するコードを全く持っていないましたが、アイデアは、このように、各文字列を分割することでした:
fragments = empty string collection
buffer = first character of the string
if character is digit, mode = NUMBER, else mode = TEXT
while there are characters left
c = next character
if c is digit and mode is NUMBER, add character to buffer
else if c is not a digit and mode is TEXT, add character to buffer
else
add contents of buffer (as string) to the fragments collection,
flip mode from TEXT to NUMBER or vice versa
buffer = c
end if
end while
add remaining contents of buffer to fragments
をだから今、あなたが交互に数フラグメントおよび非数の断片を含む、ストリングのリストを持っています。 (例えば。something-1.0.26.jar
は{ 'something-', '1', '.', '0', '.', '26', '.jar' }
になります)
これを両方の文字列に適用すると、ペアのフラグメントを1つずつ比較するコンパレータを作成できます。両方が数字の場合は、両方がテキストの場合は数値比較、一方が数字の場合は、もう一方はテキストで、数字が最初に来る。
私はこれがあなたが望むものよりもはるかに多いことを知っていますが、それは多くの状況で持っているのは非常に便利なコードです。
申し訳ありませんが、私が明白に言及していると思うならば、あなた自身とあなたが行くことができます。 –
はい、どうすればよいですか?私はちょうどJavaの初心者です:) – MiJyn
@ lkjoel http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – talnicolas