2012-02-16 39 views
0

我正在尋找shell命令的純java替代品:sort -V。我正在尋找一個可以簡單插入的Comparator類。 sort -V命令只是使用版本系統對文件進行排序(即3.2.0-113.2.0-1大10,而不是.1大)。用於'sort -V'的Java替代

在此先感謝!

+0

對不起,如果你認爲我提到明顯 - 只是自己定義這樣的比較器,你很好去。 – 2012-02-16 19:21:11

+0

是的,但我該怎麼做?我只是一個新手在Java :) – MiJyn 2012-02-16 19:21:57

+0

@lkjoel http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – talnicolas 2012-02-16 19:22:54

回答

0

初學者:

如果你的版本字符串被明確定義,那麼你可以把它分解成不同的號碼,並將其直接比較。

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(); 
} 

現在你可以改變你實現你想要的任何時間,在你的程序不會影響任何東西 - 你甚至不「需要」考慮單獨比較,這些應在插入任何自尊的有序數據結構中時自動排序自己。

1

我寫了一個通用的「像人一樣」比較一次。我沒有代碼來顯示,但當時的想法是每個字符串分割是這樣的:

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' }

如果你這樣做兩個字符串,然後你可以寫一個比較對的片段逐一比較:如果兩個都是數字,做一個數值比較,如果兩者都文本字符串比較,如果其中一個是數字,另一個是文本,數字排在第一位。

我知道這比你想要的要多得多,但它在很多情況下是相當有用的一段代碼。