【问题标题】:Sort list of numbers as strings with more than one decimal point in Java在Java中将数字列表排序为具有多个小数点的字符串
【发布时间】:2020-05-22 07:18:10
【问题描述】:

我正在尝试对这个 ArrayList 进行排序:

["1","1.1","1.2","1.3","2.1","2.3","4","4.1","6","7.1","8","8.1","10.1","2.4.7","2.2","2.4.8","3","2.4.2","2.4.9","2.4.5","5","5.1","7","2.4.4","2.4.6","2.4.1","2","2.4","3.1","6.1","9","9.1","10","11","11.1","12","12.1","13","2.4.3"]

我使用了Collections.sort(),但它只适用于小于 10 的小数,因为当一个项目有超过 10 个小数时,按数字排序而不是按列表顺序排序。例如从 1.1 到 1.14 的列表,结果是这样的:

1.1, 1.10, 1.11, 1.12, 1.13, 1.14, 1.2, 1.3, ... 1.8, 1.9

但应该是这样的:

1.1, 1.2, 1.3, ... 1.9, 1.10, 1.11, 1.12, 1.13, 1.14

而且只有一位小数。

最后它应该有的结果是:

["1","1.1","1.2","1.3","2","2.1","2.2","2.3","2.4","2.4.1","2.4.2","2.4.3","2.4.4","2.4.5","2.4.6","2.4.7","2.4.8","2.4.9","3","3.1","4","4.1","5","5.1","6","6.1","7","7.1","8","8.1","9","9.1 ","10","10.1","11","11.1","12","12.1","13"]

我接受任何建议。

谢谢

【问题讨论】:

  • 尝试进行自定义排序。
  • 您的数字是字符串,因此您是按字母顺序而不是数字顺序对它们进行排序。另外,"2.4.5" 之类的东西是什么?
  • 也许最好用 3 个元素制作每个字符串的元组/数组。并且主要按第一个元素排序,然后是第二个,然后是第三个。

标签: java android


【解决方案1】:

您可以尝试实现自己的自定义比较器:

public class CustomComparator implements Comparator<String> {
    @Override
    public int compare(String version1, String version2) {
        String[] parts1 = splitByParts(version1);
        String[] parts2 = splitByParts(version2);

        for (int i = 0; i < Math.min(parts1.length, parts2.length); i++) {
            int partComparison = compareParts(parts1[i], parts2[i]);
            if (partComparison != 0) {
                return partComparison;
            }
        }
        return Integer.compare(parts1.length, parts2.length);
    }

    protected String[] splitByParts(String version) {
        return version.split("\\.");
    }

    private int compareParts(String firstPart, String secondPart) {
        int firstPartValue = Integer.parseInt(firstPart);
        int secondPartValue = Integer.parseInt(secondPart);
        return Integer.compare(firstPartValue, secondPartValue);

    }
}

然后只需调用:

String[] arr = {"1", "1.1", "1.2", "1.3", "2.1", "2.3", "4", "4.1", "6", "7.1", "8", "8.1", "10.1", "2.4.7", "2.2", "2.4.8", "3", "2.4.2", "2.4.9", "2.4.5", "5", "5.1", "7", "2.4.4", "2.4.6", "2.4.1", "2", "2.4", "3.1", "6.1", "9", "9.1", "10", "11", "11.1", "12", "12.1", "13", "2.4.3"};
Arrays.sort(arr, new CustomComparator());
for (String s : arr) {
       System.out.println(s);
}

请注意,这是就地排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多