Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序,用于按升序对版本控制字符串进行排序_Java_Sorting_Versioning - Fatal编程技术网

Java程序,用于按升序对版本控制字符串进行排序

Java程序,用于按升序对版本控制字符串进行排序,java,sorting,versioning,Java,Sorting,Versioning,我有一个包含版本字符串的列表,例如: List<String> versions_list = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"); 如何在Java中执行此操作。假设: List<String> versions = Arrays.asList("1.1.2", &qu

我有一个包含版本字符串的列表,例如:

List<String> versions_list = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
如何在Java中执行此操作。

假设:

List<String> versions = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");
。。。使用lambda表达式

versions.sort((l, r) -> {
    String[] left = l.split("\\.");
    String[] right = r.split("\\.");
    int iterableLength = Math.min(left.length, right.length);
    for (int i=0; i<iterableLength; i++) {
        if (!left[i].equals(right[i])) {
            return Integer.parseInt(left[i]) - Integer.parseInt(right[i]);
        }
    }
    return 0;
});
versions.sort((l,r)->{
字符串[]左=l.split(\\);
字符串[]right=r.split(“\\”);
int iterableLength=Math.min(left.length,right.length);
对于(int i=0;i您可以使用如下所示:

    List<String> sorted = List.of("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2")
            .stream()
            .sorted((s1, s2) -> {
                String[] s1Parts = s1.split("\\.");
                String[] s2Parts = s2.split("\\.");

                Integer[] s1IntParts = Arrays.stream(s1Parts).map(Integer::parseInt).toArray(Integer[]::new);
                Integer[] s2IntParts = Arrays.stream(s2Parts).map(Integer::parseInt).toArray(Integer[]::new);

                int comparisonResult = -1;
                for (int i=0; i<3; i++) {
                    comparisonResult = Integer.compare(s1IntParts[i], s2IntParts[i]);
                    if (comparisonResult != 0) {
                        break;
                    }
                }
                return comparisonResult;
            })
            .collect(Collectors.toList());
List sorted=List.of(“1.1.2”、“1.0.0”、“1.3.3”、“1.0.12”、“1.0.2”)
.stream()
.已排序((s1,s2)->{
字符串[]s1Parts=s1.split(“\\”);
字符串[]s2Parts=s2.split(“\\”);
Integer[]s1IntParts=Arrays.stream(s1Parts).map(Integer::parseInt).toArray(Integer[]::new);
整数[]s2IntParts=Arrays.stream(s2Parts).map(Integer::parseInt).toArray(Integer[]::new);
int comparisonResult=-1;
对于(int i=0;i
对不起,我再次输入代码
输出:1.0.0 1.0.2 1.0.12 1.1.2 1.3.3,您也可以使用cycle!这里有一个现代的解决方案,使用
比较器。比较
以基于预先存在的标准库
数组构建版本字符串比较器。比较(int[])
方法

    List<String> versionList = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");

    Pattern pattern = Pattern.compile("\\.");
    Comparator<String> versionComparator = Comparator.comparing(
        str -> pattern.splitAsStream(str)
            .mapToInt(Integer::parseInt)
            .toArray(),
        Arrays::compare);
    versionList.sort(versionComparator);
    
    System.out.println(versionList);
List versionList=Arrays.asList(“1.1.2”、“1.0.0”、“1.3.3”、“1.0.12”、“1.0.2”);
Pattern=Pattern.compile(“\\”);
Comparator versionComparator=Comparator.Comparating(
str->pattern.splitAsStream(str)
.mapToInt(整数::parseInt)
.toArray(),
数组::比较);
sort(versioncompactor);
System.out.println(版本列表);

这里有一种方法使用比较器的lambda。处理不同长度的版本ID

Comparator<String> comp = (a, b) -> {
    String[] aa = a.split("\\.");
    String[] bb = b.split("\\.");
    int r = 0;
    for (int i = 0; i < Math.min(aa.length, bb.length); i++) {
        r = Integer
                .compare(Integer.valueOf(aa[i]),Integer.valueOf(bb[i]));
        if (r != 0) {
            return r;
        }
    }
    return Integer.compare(aa.length, bb.length);
};
            
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0",
        "1.3.3", "1.0.12", "1.0.0.12", "1.1.0.2", "1.0.2", "1.2.1.2.3");
versions_list.sort(comp);
System.out.println(versions_list);

首先,提供一个有效的Java代码。是否保证版本总是以
a.B.C
的形式,或者像
a.B
a.B.C.D
这样的版本也是可能的?不要重新发布一个新的答案。只需更正你的旧答案。好的,我比较新鲜。我应该编辑我的旧答案吗?不。这次不。不要担心。欢迎使用Stack Overf低。:)好的,谢谢!我记得。
public static void main(String[] args) {
    String[] versions_list = {"1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"};
    Arrays.sort(versions_list, (o1, o2) -> {
        String[] str1 = o1.split("\\.");
        String[] str2 = o2.split("\\.");
        if (!Integer.valueOf(str1[0]).equals(Integer.valueOf(str2[0])))
            return Integer.valueOf(str1[0]) - Integer.valueOf(str2[0]);
        if (!Integer.valueOf(str1[1]).equals(Integer.valueOf(str2[1])))
            return Integer.valueOf(str1[1]) - Integer.valueOf(str2[1]);
        return Integer.valueOf(str1[2]) - Integer.valueOf(str2[2]);
    });
    for (String str : versions_list) {
        System.out.println(str);
    }
}
    List<String> versionList = Arrays.asList("1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2");

    Pattern pattern = Pattern.compile("\\.");
    Comparator<String> versionComparator = Comparator.comparing(
        str -> pattern.splitAsStream(str)
            .mapToInt(Integer::parseInt)
            .toArray(),
        Arrays::compare);
    versionList.sort(versionComparator);
    
    System.out.println(versionList);
Comparator<String> comp = (a, b) -> {
    String[] aa = a.split("\\.");
    String[] bb = b.split("\\.");
    int r = 0;
    for (int i = 0; i < Math.min(aa.length, bb.length); i++) {
        r = Integer
                .compare(Integer.valueOf(aa[i]),Integer.valueOf(bb[i]));
        if (r != 0) {
            return r;
        }
    }
    return Integer.compare(aa.length, bb.length);
};
            
List<String> versions_list = Arrays.asList("1.1.2", "1.0.0",
        "1.3.3", "1.0.12", "1.0.0.12", "1.1.0.2", "1.0.2", "1.2.1.2.3");
versions_list.sort(comp);
System.out.println(versions_list);
[1.0.0, 1.0.0.12, 1.0.2, 1.0.12, 1.1.0.2, 1.1.2, 1.2.1.2.3, 1.3.3]