2012-01-30 42 views
2

是否有一種簡單的方法可以找到MAX號碼,其中號碼以x.y.z格式存儲?例如管理一些系統版本。從x.y.z中獲取最大值格式編號

我試過Collection.max(list),這是行不通的。

示例代碼:

public static void main(String args[]) 
{ 
    List<String> list = new ArrayList<String>(); 

    list.add("1.0.0"); 
    list.add("1.1.0"); 
    list.add("1.9.0"); 
    list.add("1.10.0"); 

    System.out.println(Collections.max(list)); 
} 

預計: 1.10.0
結果: 1.9

感謝您的時間。

回答

2

嘗試使用此一:

Collections.max(myList, new Comparator<String>() { 

     @Override 
     public int compare(String lhs, String rhs) { 
      String[] first = lhs.split("\\."); 
      String[] second = rhs.split("\\."); 
      for (int i = 0; i < first.length; i++) { 
       if(Integer.valueOf(first[i]) > Integer.valueOf(second[i])) { 
        return 1; 
       } 
       if(Integer.valueOf(first[i]) < Integer.valueOf(second[i])) { 
        return -1; 
       } 
      } 
      return 0; 
     } 
    }); 
+0

正則表達式模式'「。」'將匹配_any_字符,而不僅僅是點。 – buc 2012-01-30 12:18:19

+0

這是現貨。只需在split方法中的dot之前添加\\。例如lhs.split( 「\\。」); – JSS 2012-01-30 12:19:06

+0

Yeap,對不起。已經更正。 – birdy 2012-01-30 12:20:39

0

這會給你1.9,因爲它不會考慮第二個數字是10,它將把它當作1,再9

編輯

如果你想要做手工,然後

  1. 根據「。」分割您的號碼。
  2. 手動檢查哪個數字更大。
+0

我知道解釋。我正在尋找一個算法來解決這個問題。反正你的時間Thx。 – JSS 2012-01-30 12:01:58

1

您可以使用max版本指定的比較:

System.out.println(Collections.max(list, new Comparator<String>() { 
    public int compare(String s1, String s2) 
    { 
     StringTokenizer st1 = new StringTokenizer(s1,"."); 
     StringTokenizer st2 = new StringTokenizer(s2,"."); 
     int res = 0; 
     String t1, t2; 
     while(st1.hasMoreTokens() && st2.hasMoreTokens()) 
     { 
      t1 = st1.nextToken(); 
      t2 = st2.nextToken(); 
      res = Integer.valueOf(t1).compareTo(Integer.valueOf(t2)); 
     } 
     if(res == 0) 
     { 
      res = st1.hasMoreTokens() ? 1 : (st2.hasMoreTokens() ? -1 : 0); 
     } 
     return res; 

    } 
    public boolean equals(Object obj) { return false; } 
})); 
2

好一件事,你需要確保Java的知道他們的數字 - 此刻,他們只是Strings,和字符串以文字排序(即按照「字母順序」)。

我的方法是創建一個實現Comparable的小類,然後它將自動與排序和比較邏輯一起工作。也許這樣的東西:

public class VersionNumber implements Comparable<VersionNumber> { 
    public final int major; 
    public final int minor; 
    public final int patch; 

    // Constructor etc. elided 

    public int compareTo(VersionNumber other) { 
     if (other.major != major) return major - other.major; 
     if (other.minor != minor) return minor - other.minor; 
     return patch - other.patch; 
    } 
} 

解析字符串來創建這個類的實例留給讀者一個練習!

2

您可能需要編寫自定義Comparator比較版本號的字符串:

public class VersionComparator extends Comparator<String> { 

    @Override 
    public int compare(String o1, String o2) { 
     // Get major/minor/revison numbers by splitting strings at dots 
     String[] p1 = o1.split("\\."); 
     String[] p2 = o2.split("\\."); 

     // Compare major versions then minor then revision until a difference found 
     for(int i = 0; i < (p1.length < p2.length) ? p1.length : p2.length; i++) { 
      int result = Integer.valueOf(p1[i]).compareTo(Integer.valueOf(p2[i])); 
      if(result != 0) return result; 
     } 

     // Return zero if they're identical 
     return 0; 
    } 
} 

的,你可以使用這個比較與Collections.max功能:

Collections.max(list, new VarsionComparator()); 
+0

不幸的是,字符串「10」小於字符串「9」 – sverre 2012-01-30 12:13:39

+0

@sverre:你是對的。最初,我想比較'整數'值,但它被意外排除了。現在更正。 – buc 2012-01-30 12:16:33