从x.y.z格式化数字获取最大值

时间:2012-01-30 11:57:44

标签: java sorting

是否有一种简单的方法可以从列表中找到 MAX 号码,其中号码以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

感谢您的时间。

5 个答案:

答案 0 :(得分: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;
    }
}

解析字符串以创建此类的实例是留给读者的练习!

答案 1 :(得分: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;
        }
    });

答案 2 :(得分: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());

答案 3 :(得分: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; }
}));

答案 4 :(得分:0)

这将给你1.9,因为它不会将第二个数字视为10,它将首先视为1然后再将其视为9

修改

如果你想手动完成,那么<​​/ p>

  1. 根据“。”分割您的号码。
  2. 手动检查哪个数字更大。