繁体   English   中英

如何在数字前用字母对字母数字字符串进行排序(升序)

[英]How to sort Alphanumeric String with letters before numbers (ascending order)

我有一个按以下顺序排列的字符串ArrayList

Collections.sort(alTest);

1G0EE147546
1G1EE147576
1G3EE147547
1G4EE147577
1G6EE147548
1G6EE147574
1G7EE147578
1G8EE147545
1G9EE147575
1GXEE147579

注意最后一条记录 1G X EE147579,当“X”出现在“9”1G 9 EE147575 之后。

我需要以这种方式对这个列表进行排序:

1GXEE147579
1G0EE147546
1G1EE147576
1G3EE147547
1G4EE147577
1G6EE147548
1G6EE147574
1G7EE147578
1G8EE147545
1G9EE147575

在数字“0”、“1”等之前加上 1G X EE147579 的“X” 1G 0 EE147546

谢谢

您可以编写自己的比较器来根据您的要求调整排序条件:

    private static final Comparator<String> comparator = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            //here comes the comparing process
            return 0;
        }
    };

比较器返回三个值之一:

  • -1 当 o1 对象应按顺序放置o2之前
  • 1 当 o1 对象应该按顺序放在 o2之后
  • 0 当比较对象相等时

然后你可以这样使用它(注意要使用 Collections.sort(...) 函数你必须使用列表结构):

        Collections.sort(list, comparator);

为了给出有关这种特定排序的一些提示,我可以建议您指定字符串中的每个字符是否都应该以这种方式排序(数字前的字母)。 只需遍历字符串字符并比较它们。 要检查字符是否是数字,请使用Character.isDigit(...)

这是一个简单的比较器示例来做你想做的事。

编辑:您还可以将比较器添加到您 Set 作为TreeSet而不是HashSet

Set<String> datas = new TreeSet<>(new SimpleComparator());

你可以参考javadoc了解更多细节

    static class SimpleComparator implements Comparator<String> {
        @Override
        public int compare(String s, String s2)
        {
            if(s == s2)
                return 0;
            if(s != null && s2 == null)
                return -1;
            if(s == null && s2 != null)
                return 1;
            return (s.charAt(2) == 'X' ? s.substring(0, 2) + ' ' + s.substring(3) : s).compareTo(s2);
        }
    }

    @Test
    public void sort() throws Exception{

        List<String> data =  Arrays.asList(
                "1G0EE147546",
                "1G1EE147576",
                "1G3EE147547",
                "1G4EE147577",
                "1G6EE147548",
                "1G6EE147574",
                "1G7EE147578",
                "1G8EE147545",
                "1G9EE147575",
                "1GXEE147579"

        );
        Collections.sort(data, new SimpleComparator());
        System.out.println(data.toString().replaceAll(",", "\n"));
    }

以下是一些输入:

  1. 您无法对HashSet排序。 Collections#sort List 您可以创建将Set传递给构造函数的 ArrayList
Set<String> hsNr = new HashSet<String>();
ArrayList list = new ArrayList(hsNr);
  1. 要按照您需要的方式对列表进行排序,您可以将Comparator作为第二个参数传递给Collections#sort
        Collections.sort(list, new Comparator<String>() {
            public int compare(String o1, String o2) {
                // write your implementation here
                // return ...  
            }
        });
  1. 您可以查看字符串比较的标准 impl 并将其用作示例来创建Comparatorjava.lang.StringUTF16#compareTo(byte[], byte[])

我使用 Java 8 流实现了它:

    public List<String> specialSort(Set<String> hsNr) {
        return hsNr.stream()
                .sorted((a, b) -> a.charAt(2) == 'X' ? b.compareTo(a) : a.compareTo(b))
                .collect(Collectors.toList());
    }

集合无法排序,因为无法保证顺序。 请注意,使用集合时没有get(index)方法。

使用RuleBasedCollator类创建自定义Collator

String rules = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I" +
              " < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R" +
              " < s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z" +
              " < 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9";
RuleBasedCollator myCollator = new RuleBasedCollator(rules);

List<String> list = Arrays.asList(
        "1G7EE147578", "1G6EE147548", "1G1EE147576", "1G0EE147546", "1G8EE147545",
        "1G4EE147577", "1G6EE147574", "1GXEE147579", "1G9EE147575", "1G3EE147547");
System.out.println("Before: " + list);
Collections.sort(list, myCollator);
System.out.println("After:  " + list);

输出

Before: [1G7EE147578, 1G6EE147548, 1G1EE147576, 1G0EE147546, 1G8EE147545, 1G4EE147577, 1G6EE147574, 1GXEE147579, 1G9EE147575, 1G3EE147547]
After:  [1GXEE147579, 1G0EE147546, 1G1EE147576, 1G3EE147547, 1G4EE147577, 1G6EE147548, 1G6EE147574, 1G7EE147578, 1G8EE147545, 1G9EE147575]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM