我如何获得最高版本?

vik*_*iii 4 java

如何对以下数组进行排序String

String[] s = {"0.1", "0.3", "0.6", "0.4", "0.5", "0.2", "0.7", "0.8", "0.9", "0.10"};
Run Code Online (Sandbox Code Playgroud)

通过排序我不是指在这里将其转换为整数并得到结果0.9.

在这里,我希望得到的价值为0.10.

在这种情况下,如果字符串数组包含1.1那么最大值将是1.1.

如果数组是这样的话我可以获得最大值,即

String[] s = {"0.1", "0.4", "0.3", "0.4", "0.5", "0.2", "0.7", "1.8", "2.9", "3.1"};
Run Code Online (Sandbox Code Playgroud)

我的代码将适用于此字符串数组,但假设是

String[] s = {"0.1", "1.4", "1.3", "0.4", "0.5", "0.2", "2.7", "1.8", "2.9", "0.1"};
Run Code Online (Sandbox Code Playgroud)

我的代码.

public String createNewVersion(
            String[] entityVersionHistory) {

Map<Integer, List<Integer>> m_Map1 = new HashMap<Integer, List<Integer>>();

String prevKey = "0";
String currentKey = null;

List<Integer> list = new ArrayList<Integer>();

for (String str: entityVersionHistory)
{
    String[] splitVersion = str.split("\\.");
    currentKey = splitVersion[0];
    if(!prevKey.equals(currentKey))
    {
        Integer s = new Integer(splitVersion[1]);

        m_Map1.put(Integer.valueOf(prevKey), list);
        list = new ArrayList<Integer>();
        list.add(s);

        prevKey = currentKey;
    }
    else
    {
        Integer s = new Integer(splitVersion[1]);
        list.add(s);
    }
}
m_Map1.put(Integer.valueOf(prevKey), list);
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

Ano*_*sse 5

这并不像你想象的那么容易.因为也有版本号3.1beta.我不打算在下面详细讨论这些,只是简要介绍一些挑战.

但基本思路如下:

  1. 字符串拆分.为数组,将各个组件转换为整数.

  2. 按组件比较.如果两个数字在第一个组件上达成一致,请跳到下一个.

所以,给定版本号3.10.1,3.9.2我们首先将它们转换为整数数组:{ 3, 10, 1 }{3, 9, 2}.然后我们测试第一个组件,但是3 == 3,我们跳到下一个组件.10 > 9,结果是第一个更大.

现在,如果你想支持beta和类似的东西,它会变得非常混乱.以Debian版本编号为例.除了点,它还有一个epoch分隔符.因此2:1.0 > 2.0(新纪元大于前一个纪元编号)的验证.A -分隔修订号.所以2-2 < 2.1-1,因为2 < 2.1(并且修订版本是主版本号的次要版本!).还有负面版本.所以1.0~beta < 1.0,但是1.0final > 1.0- 将其读作"1.0减去beta"和"1.0加上最后".

没有关于如何阅读这些标准的独特标准.只有通用的约定是.将低优先级组件分开,同时~是预发布的流行指标(这就是它应该在非后缀版本之前排序的原因).


jlo*_*rdo 3

这基本上是Anny-Mousse在代码中的答案:限制是,版本号中只允许使用数字和点。

public class Version implements Comparable<Version> {

    private int[] version;

    public Version(String str) {
        if (!str.matches("\\d+[.\\d]*?\\d")) {
            throw new IllegalArgumentException(
                    "Version must start and end with digit and"
                    + "only contain digits and dots."
                    + " You provided '" + str + "'");
        }
        String[] tokens = str.split("\\.");
        version = new int[tokens.length];
        for (int i = 0; i < tokens.length; i++) {
            version[i] = Integer.parseInt(tokens[i], 10);
        }
    }

    @Override
    public int compareTo(Version other) {
        Version shorterOne =
                this.version.length < other.version.length ?
                this : other;
        int min = shorterOne.version.length;
        for (int i = 0; i < min; i++) {
            if (this.version[i] != other.version[i]) {
                return this.version[i] - other.version[i];
            }
        }
        return this.version.length - other.version.length;
    }

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder(2 * version.length);
        for (Integer i : version) {
            str.append(i).append('.');
        }
        return str.deleteCharAt(str.length() - 1).toString();
    }

    public static void main(String[] args) {
        String[] s = {"1.4","1.3","0.4","0.5","0.2","2.7","1.8","2.9","0.1"};
        List<Version> list = new ArrayList<>(s.length);
        for (String str : s) {
            list.add(new Version(str));
        }
        Version max = Collections.max(list);
        System.out.println(max);
    }
}
Run Code Online (Sandbox Code Playgroud)