基于带多个下划线的整数的Java列表字符串排序

mec1mxoz  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(183)

Hi All我有String数据类型的arrayList,但需要使用Java 8进行多个下划线的整数排序,为了您的参考,我添加了示例数据,原始数据来自Liferay 7.1 DDL

List<String> keyValues = new ArrayList<String>();
keyValues.add("100_10_20_1");
keyValues.add("100001");
keyValues.add("100002");
keyValues.add("100002_1");
keyValues.add("100003");
keyValues.add("100");
keyValues.add("100_1");
keyValues.add("100_2");
keyValues.add("100_1_1");
keyValues.add("100_10_20");
keyValues.add("10000001");
keyValues.add("100_10_20_2");

我试图用0替换下划线,但有时会发生什么100_1用0替换_,然后它变成10001,但如果我已经有10001值存在于列表中呢?即使同样的事情为空如果我替换_与“”然后它成为1001但如果我已经有1001然后我再次面临的问题

基于下划线的精确逻辑为

100
 100_1
 100_1_2 
 /after that only/
 100_2
 100_2_2
/after that/
 103
 104
 105
 10000
/similarly the pattern repeats/
 10000_1
 10000_2
 10000_2_1
 100002

我需要精确的输出作为

100
    100_1
    100_1_1
    100_2
    100_10_20
    100_10_20_1
    100_10_20_2
    100001
    100002
    100002_1
    100003
    10000001

我尝试用0或空格替换下划线,但如果列表中已经存在该数字,则可能会出现这种情况,如果我替换为点并存储为Double,则会发生多指针异常

bttbmeg0

bttbmeg01#

我做了一个比较器,然后分割字符串,并根据每个字符串的最小令牌数量进行处理。

static Comparator<String> stringComparator = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            String[] s1 = o1.split("_");
            String[] s2 = o2.split("_");

            int minLen = Math.min(s1.length, s2.length);

            for (int i=0; i < minLen; i++){
                if (!s1[i].equals(s2[i])){
                    return Integer.parseInt(s1[i]) - Integer.parseInt(s2[i]);
//                    return s1[i].compareTo(s2[i]);  //not natural order/sort
                }
            }

            return o1.compareTo(o2);
        }
    };

这样称呼它:

List<String> keyValues = new ArrayList<String>();
    keyValues.add("100001");
    keyValues.add("100002");
    keyValues.add("100002_1");
    keyValues.add("100003");
    keyValues.add("100");
    keyValues.add("100_1");
    keyValues.add("100_2");
    keyValues.add("100_1_1");
    keyValues.add("100_10_20");
    keyValues.add("10000001");
    keyValues.stream().sorted(stringComparator).forEach(System.out::println);

给出输出:

100
100_1
100_1_1
100_2
100_10_20
100001
100002
100002_1
100003
10000001

相关问题