簡體   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