使用Java8的Comparator对汉字进行排序

Comparator类从Java 1.2版本就已经有了,在Java8开始,加入了适用于Lambda的一些方法,使代码编写更加简洁。
在Java中对汉字进行排序,其实是没有规则的,要按照汉字进行排序,需要做一点处理。

对汉字排序,需要定义另一个对象:Collator instance = Collator.getInstance(Locale.CHINA),Collator指定了所在区域,基于Collator进行排序,汉字就可以做到正确排序了。

Demo演示了基于汉字进行多属性排序,同时用了三种方法演示了排序代码,包括:匿名类、lambda和lambda表达式进行排序。

代码:

import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

/**
 * Java8 Comparator排序,演示了基于汉字多字段排序
 * 直接使用汉字排序是无效的,需要特殊处理一下
 */
public class ComparatorTest2 {

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setAge(20);
        p1.setName("张三");

        Person p2 = new Person();
        p2.setAge(20);
        p2.setName("李四");

        Person p3 = new Person();
        p3.setAge(18);
        p3.setName("王五");

        Person p4 = new Person();
        p4.setAge(25);
        p4.setName("周六");

        Person p5 = new Person();
        p5.setAge(21);
        p5.setName("李四");

        List<Person> personList = Arrays.asList(p1, p2, p3, p4, p5);


        //用三种方式进行排序,分别是匿名类、lambda和lambda表达式进行排序
        //1、匿名类按照汉字进行排序
        personList.sort(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                Collator instance = Collator.getInstance(Locale.CHINA);
                return instance.compare(o1.getName(),o2.getName());
            }
        });
        personList.forEach(System.out::println);

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

        //2、lambda表达式按照单个汉字属性进行排序
        personList.sort((o1, o2) -> {
            Collator instance = Collator.getInstance(Locale.CHINA);
            return instance.compare(o1.getName(),o2.getName());
        });
        personList.forEach(System.out::println);

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

        //2、定义独立的lambda表达式,实现多属性排序,先按照汉字升序排序,汉字相同则按照年龄降序排序
        Comparator<Person> personComparator = (Person o1, Person o2) -> {
            Collator instance = Collator.getInstance(Locale.CHINA);
            return instance.compare(o1.getName(), o2.getName());
        };
        personList.sort(personComparator.thenComparing(Person::getAge, Comparator.reverseOrder()));
        personList.forEach(System.out::println);

    }
}
/*
//匿名类按照汉字进行排序
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
------------------------------------------------
//lambda表达式按照汉字进行排序
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
------------------------------------------------
//定义lambda表达式,实现多属性排序,先按照汉字升序排序,汉字相同则按照年龄降序排序
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
 */