当前位置: 首页 > 知识库问答 >
问题:

按升序排序版本控制字符串的Java程序

杜俊风
2023-03-14

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

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

我想对它进行排序,结果会是这样的:

["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]

如何在Java做到这一点。

共有3个答案

温源
2023-03-14
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);
    }
}

对不起,我又写代码了

林烨华
2023-03-14

您可以使用如下所示的比较器来完成此操作:

    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());
朱梓
2023-03-14

假设:

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

只要默认比较器不能应用于这种类型的字符串,就应该使用自定义的比较器,否则将不会对数字进行数字排序(例如,12被认为低于2

versions.sort(new Comparator<String>() {
    @Override
    public int compare(final String l, final String 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;
    }
});

使用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;
});

这是一个非常简单的解决方案,使用Regex将版本表示法拆分成3个单独的部分。 不等于另一部分的每个部分都是数字比较的主题,因此需要integer.parseInt(String)

 类似资料:
  • 问题内容: 我创建了一个sqlite数据库,该数据库具有一个存储温度值的表。第一次将温度值以升序写入数据库。然后,我将数据库中的温度值读取到一个列表中,然后将该列表添加到组合框中以选择温度- 效果很好。 结果列表为: 然后,我向数据库添加一个新的温度值,例如“ 33”。 它被附加到表的末尾。如果我现在阅读温度,列表将变为: 如果我做或,最终的结果是 有什么简单的方法可以按升序对列表进行排序,以便得

  • 问题内容: STRINGS.txt的示例内容: 是否可以仅使用bash对所有这些版本字符串进行排序,而最新版本位于顶部? 问题答案: 这是可能的,但工作量却很愚蠢。如果您使用GNU排序: …将完全按照您的要求进行。 现在,如果您 真的 没有任何外部工具,那么您将遇到麻烦。Freenode的#bash IRC频道上的BlastHardcheese已在本机bash中编写了以下quicksort算法,出

  • 我创建了这个随机生成的arraylist,它生成1-50个数字。我想按升序对生成的数字进行排序。不使用集合。sort,我如何使用ArrayList进行排序?

  • 我试图计算每个字符串中的元音,我想根据count变量交换字符串,但我做不到。在接受字符串后,我用toCharArray()函数将其转换为char数组,并将每个字符与小写和大写元音进行比较。 我收到一个错误。编写代码部分的任何帮助都将不胜感激。 输入: 输出:

  • 如何获取字符串类型月份的升序。 如何进行asc排序请帮助

  • 问题内容: 我有一个带有文件名的字符串列表: 输出: 但是我想要: 有没有简单的方法可以做到这一点? 问题答案: 是: 说明:字符串按词法排序,因此在字符串之前(因为< ,因此忽略第一个字符串之后的内容)。因此,我们使用的参数是一个回调函数,该函数接受一个列表项并返回用于对该项目进行排序的值- 在您的情况下,是从文件名的第一部分构建的整数。这样,列表就可以正确地按数值排序。

  • 问题内容: 我正在通过NEST c#使用ElasticSearch。我有很多关于人的信息 我希望能够按lastName以及长度的顺序对项目列表进行过滤和排序,因此名称中只有5个字符的人会出现在结果集的开头,然后是10个字符的人。 所以我想用一些伪代码做类似的事情 我是ElasticSearch的新手,所以任何示例都将非常有帮助。 问题答案: 您可以使用基于脚本的排序进行排序。 作为一个玩具示例,我

  • 我下面的代码不起作用,我也不知道为什么。 它编译得很好,但结果似乎没有排序。