我正在尋找shell命令的純java替代品:sort -V
。我正在尋找一個可以簡單插入的Comparator類。 sort -V
命令只是使用版本系統對文件進行排序(即3.2.0-11
比3.2.0-1
大10,而不是.1大)。用於'sort -V'的Java替代
在此先感謝!
我正在尋找shell命令的純java替代品:sort -V
。我正在尋找一個可以簡單插入的Comparator類。 sort -V
命令只是使用版本系統對文件進行排序(即3.2.0-11
比3.2.0-1
大10,而不是.1大)。用於'sort -V'的Java替代
在此先感謝!
初學者:
如果你的版本字符串被明確定義,那麼你可以把它分解成不同的號碼,並將其直接比較。
3.2.0-11變爲4個整數,3,2,0和11而變得3.2.0-1 3,2,0和1。
假設你使他們成陣列你比較SRC [3 ] < dest [3],src [2] < dest [2],...在比較器中,您就完成了。
對於String.split(「.-」),然後在結果數組中的每個條目上調用Integer.getInteger(src [n]),可以輕鬆完成此操作。
高級:
現在,如果你想要的這個「高級」版本,我可以告訴你一個小竅門。如果你把你的價值觀和它們合併成一個單一的長 - 是這樣的:
long l=src[3] << (16 * 3) + src[2] << (16 * 2) + src[1] << (16 * 1) + src[0];
這將所有的各個字段到一個單一的長可以比較的結合。 (它將需要一個小的鑄件和第一個領域不能越過版本#32767,所有其他可以去65535)
如果你確定沒有一個數字會超過255,那麼你甚至可以移動多個8,而不是16,並將它們打包成一個int(或長,可以處理一個版本號多達7個領域 - 或者8,只要第一個不超過127去)
的好處部分這個技巧是你從4比較到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' }
)
如果你這樣做兩個字符串,然後你可以寫一個比較對的片段逐一比較:如果兩個都是數字,做一個數值比較,如果兩者都文本字符串比較,如果其中一個是數字,另一個是文本,數字排在第一位。
我知道這比你想要的要多得多,但它在很多情況下是相當有用的一段代碼。
對不起,如果你認爲我提到明顯 - 只是自己定義這樣的比較器,你很好去。 – 2012-02-16 19:21:11
是的,但我該怎麼做?我只是一個新手在Java :) – MiJyn 2012-02-16 19:21:57
@lkjoel http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – talnicolas 2012-02-16 19:22:54