java - 在 Java 中使用比较器自定义排序字母数字字符串

标签 java string sorting comparator

假设我有一个字符串列表 'ABC123''XXY111''EFG001' 等等。

我需要用两种方式对这些字符串进行排序,

1) First sorted by the numbers.
2) Then it sorted by the letters.

我尝试使用比较器对字符串进行排序。

首先,我拆分字符串并在开头添加数字,然后使用 Collections.sort() 对列表进行排序。

但我不确定如何以两种方式对它进行排序。

下面是我的代码,

  public class SortAlphaNumeric {   

    static class MyComparator implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {

            String oo1 = o1.substring(3) + o1.substring(0,3);
            String oo2 = o2.substring(3) + o2.substring(0,3);

            return oo1.compareTo(oo2);
        }       
    }

    public static void main(String[] args) {

        String str1 = "ABC123";
        String str2 = "ACB111";
        String str3 = "XXX003";
        String str4 = "XYZ001"; 
        String str5 = "CDE123";
        String str6 = "FEG111"; 


        List<String> list = new ArrayList<String>();        

        list.add(str1);
        list.add(str2);
        list.add(str3);
        list.add(str4);
        list.add(str5);
        list.add(str6);

        System.out.println("Before sorting");

        Iterator<String> itr1 = list.iterator();

        while(itr1.hasNext()) {
            System.out.println(itr1.next());
        }

        SortAlphaNumeric.MyComparator myComp = new SortAlphaNumeric.MyComparator();

        System.out.println("========================");

        Collections.sort(list, myComp); 

        System.out.println("After 1st sorting");

        Iterator<String> itr2 = list.iterator();

        while(itr2.hasNext()) {
            System.out.println(itr2.next());
        }

        Collections.sort(list, myComp);

        System.out.println("After 2nd sorting");

        Iterator<String> itr3 = list.iterator();

        while(itr3.hasNext()) {
            System.out.println(itr3.next());
        }
    }
}

最佳答案

您可以轻松组合两个比较器,将 0-3 索引比较链接到 3-6 索引比较。

以下是使用子字符串代替 split 的替代方法(进一步简化代码):

Comparator<String> myComp = Comparator.comparing((String s) -> s.substring(3))
                                      .thenComparing(s -> s.substring(0, 3));

// resulting in:
// XYZ001, XXX003, ACB111, FEG111, ABC123, CDE123

假设文本具有这个标准长度,上面的代码消除了对 MyComparator 类的需要。

关于java - 在 Java 中使用比较器自定义排序字母数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708817/

相关文章:

c - 列表上的简单 merge_sort - 分析

objective-c - NSDictionary 键按数值排序

javascript - 为 JavaScript 数组树创建 forEach 语句

java - 为什么使用 equals() 方法时两个具有相同数据的对象不相等

java:尝试通过方法从字符串数组返回字符串值

java - 如何获得默认的日期和时间格式模式

javascript - 处理 Javascript 变量中的大数据 : bad practice?

java - libgdx 着色器 - 尝试设置颜色

java - 带有 Fragments 的 AdapterView 不支持 addView(View)

java - 哪个 HTML 标记最适合用于 Java applet(APPLET、EMBED、OBJECT)?