对版本号进行排序

Abh*_*ngh 4 java sorting version

我下面的代码应该将版本号排序为正确的顺序。在大多数情况下,它可以工作,但它无法通过我无权访问的隐藏测试用例。考虑到是否有任何边缘情况,你可以看到我可能会丢失。

import java.util.*;

public class Answer {   
public static void main(String[] args)
{
    //Testing 
    String[] versions = {"0.0.0","0","0.0","1.113","0.0.0.1","2.0.0","1.2","2","0.1","1.2.1","1.1.1","2.0"};
    String[] results = answer(versions);
    for(int i =0; i<results.length;i++)
    {
        System.out.println(results[i]);
    }   
}
public static String[] answer(String[] l) { 

    String temp = new String();
    //Insertion sort on the given array to assign correct version numbers
    for (int i = 1; i < l.length; i++) {
        for(int j = i ; j > 0 ; j--){
            if(compareVersion(l[j],l[j-1])<0){
                temp = l[j];
                l[j] = l[j-1];
                l[j-1] = temp;
            }
        }
    }
    return l;
} 
//Will compare version numbers breaking it apart into a String array
public static int compareVersion(String version1, String version2) {
String[] arr1 = version1.split("\\.");
String[] arr2 = version2.split("\\.");

int i=0;
while(i<arr1.length || i<arr2.length){
    if(i<arr1.length && i<arr2.length){
        if(Integer.parseInt(arr1[i]) < Integer.parseInt(arr2[i])){
            return -1;
        }else if(Integer.parseInt(arr1[i]) > Integer.parseInt(arr2[i])){
            return 1;
        }
        else if(Integer.parseInt(arr1[i]) == Integer.parseInt(arr2[i]))
        {
            int result = specialCompare(version1,version2);
            if(result != 0)
            {
                return result;
            }
        }
    } else if(i<arr1.length){
        if(Integer.parseInt(arr1[i]) != 0){
            return 1;
        }
    } else if(i<arr2.length){
       if(Integer.parseInt(arr2[i]) != 0){
            return -1;
        }
    }

    i++;
}

return 0;
}
  // Meant for when version numbers such as 2 and 2.0 arise. This method will make sure to
  // put the smaller version number ( in length) first
  public static int specialCompare(String str1, String str2)
 {
      String[] arr1 = str1.split("\\.");
     String[] arr2 = str2.split("\\.");
     for(int i =1; i<arr1.length;i++)
     {
        if(Integer.parseInt(arr1[i]) != 0)
        {
            return 0;
        }
    }
    for(int j =1; j<arr2.length;j++)
    {
        if(Integer.parseInt(arr2[j]) != 0)
        {
            return 0;
        }
    }
    if(arr1.length < arr2.length)
    {
        return -1;
    }
    else
    {
        return 1;
    }

}
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 6

我在上面的评论中阅读了Lukas Eder 的博客文章,并根据JDK 提案创建了一个按版本(或章节)号排序的项目。java.util.Comparator

VersionNumberComparator在 GitHub gist 中定义。下面的代码展示了它是如何工作的。

import java.util.ArrayList;
import java.util.List;

public class JavaTest {

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

        chapters.add("1.1");
        chapters.add("1.2");
        chapters.add("1");
        chapters.add("1.3");
        chapters.add("1.1.1");
        chapters.add("5.6");
        chapters.add("1.1.10");
        chapters.add("4");
        chapters.add("1.1.9");
        chapters.add("1.2.1.10");
        chapters.add("2.1.1.4.5");
        chapters.add("1.2.1.9");
        chapters.add("1.2.1");
        chapters.add("2.2.2");
        chapters.add("1.2.1.11");

        System.out.println("UNSORTED: " + chapters.toString());

        chapters.sort(VersionNumberComparator.getInstance());
        System.out.println("SORTED:   " + chapters.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

UNSORTED: [1.1, 1.2, 1, 1.3, 1.1.1, 5.6, 1.1.10, 4, 1.1.9, 1.2.1.10, 2.1.1.4.5, 1.2.1.9, 1.2.1, 2.2.2, 1.2.1.11]
SORTED:   [1, 1.1, 1.1.1, 1.1.9, 1.1.10, 1.2, 1.2.1, 1.2.1.9, 1.2.1.10, 1.2.1.11, 1.3, 2.1.1.4.5, 2.2.2, 4, 5.6]
Run Code Online (Sandbox Code Playgroud)