JAVA中List集合的汉字排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中List集合的汉字排序相关的知识,希望对你有一定的参考价值。

如题 List里放的是中文名称 我想按拼音首字母排序list里的汉字 有什么好的方法?
望大家踊跃发言!!
那要是 List里放的是javabean。并且该bean对象只有一个属性‘功能名称’,是汉字的功能名称。
又如何给该List排序?要求是按javabean中该属性的'功能名称‘的首字母拼音进行排序。 会根据回答加分的!!

先要设定list的排序规则 意思是要建立一个比较器 这个比较器就是装的两个中文的比较规则(按拼音首字母排序)

然后调用集合类的排序方法对list进行排序就行了。。。

汉字取拼音首字母有很多方法 你去网上搜下大把代码

bean的一样啊 举个例子吧:
class mybean implements Comparator


private String funcName;

public mybean()



public mybean(String func)

this.funcName = func;


public void setFuncName( String funcName)

this.funcName = funcName;


public String getFuncName()

return this.funcName;

public int compare(mybean o1, mybean o2)

String fname1 = o1.getFuncName();
String fname2 = o2.getFuncName();

//下面对fname和fnam2进行比较 比较规则是取fname1和fname2的拼音首字母进行比较 如果fname1的拼音首字母较大 则返回1 否则返回-1 相等返回0



然后 List<mybean> al = new ArrayList<mybean>();

al.add(new mybean("中国"));
al.add(new mybean("美国"));

最后再调用Collections.sort(al,new mybean());就可以对al中的mybean进行排序
参考技术A 中文的要按拼音字母排序,貌似直接是没有办法的吧...
有一种方法是需要先定义一个"字典",就像真实的字典一样,如:
你:ni
我:wo
好:hao
........
然后排序时汉字到"字典"中查找对应的拼音就可以排序啦
这种字典应该在网上可以找的到,已经有整理的啦。
这应该是种笨方法,不知是否有高人有好的办法
参考技术B 汉字排序的办法也有很多,就看你是要按照那种策略排序了。

1.如果仅仅是按汉字的ASCII码进行排序的话,那就和英文或者数字是一样的排序方法。(例如string a = new string("你");string b = new string ("我");if(a>b)...)

2.如果需要按照汉字的拼音排序的话,你就需要数据字典了。就是上面那位说的那样:("a","啊阿吖嗄腌锕锕");
参考技术C ("a","啊阿吖嗄腌锕锕");
("ai","爱矮挨哎碍癌艾唉哀蔼隘埃皑嗌嫒瑷暧捱砹嗳锿霭乂乃伌僾儗凒剀剀叆呃呝啀嘊噫嗳堨塧壒娭娾嫒嵦爱懓懝敱敳昹暧欬唉毐溰溾濭烠焥瑷皑皧瞹硋磑碍絠薆蔼諰譪譺賹躷醷鎄鑀阂阂阨阸隑霭靉餲馤呆鯦鱫鴱崖");
("an","按安暗岸俺案鞍氨胺庵揞犴铵桉谙鹌埯黯侒儑匼厈咹唵啽垵垾堓婩媕屽峖晻洝玵痷盦盫碪罯腤荌庵萻葊蓭裺誝谙豻貋遃钳铵錌钳暗阴隂隌雸鞌韽顸頞顸馣鮟鴳鹌鶕");
("ang","昂肮盎仰昂岇昻枊腌醠肮");
("ao","袄凹傲奥熬懊敖翱澳嚣拗媪廒骜嗷坳遨聱螯獒鏊鳌鏖岙厫嗸噢嚻嚣垇墺墽奡奥媪嫯岰嶅嶴慠扷抝摮擙柪梎棍泑滶澚熝爊獓璈眑磝硗礉翶翺芺蔜蝹袄謷謸軪郩鏕镺隞骜鳌鴁鴢鷔鳌");
("ba","把八吧爸拔罢跋巴芭扒坝霸叭靶笆疤耙捌粑茇岜鲅钯魃菝灞仈叐哱哵坺垻墢坝夿妭峇弝抜抪朳杷柭欛湃炦犮玐癹皅矲笩紦罢羓胈茷萆蚆覇詙豝跁軷釛釟钯颰魞鮁鮊鲃鲌鼥");
("bai","百白摆败拜佰稗掰庍拝挀排摆败栢派猈竡粨粺絔薜薭摆贁鞁鞴韛");
("ban","半办班般拌搬版斑板伴扳扮瓣颁绊癍坂钣舨阪瘢坢埿姅岅怑搫攽斒昄朌柈湴瓪秚籓粄绊肦蝂螁螌褩覂豳跘辧钣鉡板靽颁魬鳻");
("bang","帮棒绑磅镑邦榜梆膀谤浜蒡嗙垹埲塝嫎峀岗幇幚帮旁挷捠搒棓牓玤硥稖纺绑縍艕蚄蛖蜯螃谤邫镑鞤騯髈");
("bao","包抱报饱保暴宝爆豹刨雹褒堡苞胞鲍炮龅孢煲褓鸨趵葆佨儤剥勹勽嘐嚗堢报媬嫑寚寳宝忁怉曓枹珤炮窇笣簿緥菢蕔藵虣蚫袌袍裒裦襃賲刨刨铇闁靌靤飹饱駂骲髱鲍鳵鸨龅宀");
("be","萡");
……

你需要的是这样的数据字典

Java-List集合排序之Comparable与Comparator的使用

Collections类说明

Collections是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。其中就有用于集合排序的sort方法,此方法主要是通过ComparableComparator来实现排序。以下介绍两者之间的使用以及区别。

Comparable用法

注意:在使用Collections的sort(List<T> list) 方法排序时,要求集合元素(对象)T必须是Comparable接口的实现类,同时重写Comparable的抽象方法 - int compareTo(T t)。方法说明如下:

 *  在使用Collection的sort排序的集合元素都必须是Comparable接口的实现类,该接口表示子类是可以比较的。
 *  同时实现接口必须重写抽象方法。
 *  - int compareTo(T t);
 *  该方法用于使当前对象与给定对象进行比较。
 *  返回值为一个int值,该值表示大小关系,它不关注具体的取值是多少,而关注的是取值范围。
 *  当返回值>0时:当前对象比参数对象大(T是传入的参数,this表示当前对象)
 *  当返回值<0时:当前对象比参数对象小(T是传入的参数,this表示当前对象)
 *  当返回值=0时:当前对象等于参数对象(T是传入的参数,this表示当前对象)

代码案例一(Java基本包装类型排序)

Integer、String等一些基本包装类,JDK默认都实现了Comparable接口,所以可以使用方法一直接进行比较排序(自然排序)

package example.demo03;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author yuanchaoyong
 */
public class ComparatorTest 

    public static void main(String[] args) 
        // 测试案例1
        testInteger();
        // 测试案例2
        testString();
    

    /**
     * List<Integer> 排序测试
     *              Integer 默认实现了Comparable接口
     *              Collections.sort默认是升序排序(自然排序)
     */
    public static  void   testInteger()
        List<Integer> integers = Arrays.asList(12,7,15,4);
        Collections.sort(integers);
        System.out.println(integers);
    

    /**
     * List<String> 排序测试
     *              String 默认实现了Comparable接口
     *              Collections.sort默认是升序排序(自然排序)
     */
    public static  void   testString()
        List<String> strings = Arrays.asList("aaa","ccc","bbb","rrr");
        Collections.sort(strings);
        System.out.println(strings);
    

输出结果

 

代码案例二 (自定义对象排序)

平常工作开发的时候,基本包装类型一般无法满足需求。所以我们定义了自定义对象,有时候需要根据对象的某一个属性进行排序。这个时候需要对象实现Comparable接口,同时重写Comparable的抽象方法 - int compareTo(T t)。这里以用户(User)年龄进行升序排序案例说明。

package example.demo03;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author yuanchaoyong
 */
public class ComparatorTest02 

    public static void main(String[] args) 
        List<User> users = Arrays.asList(new User("王五",50),new User("张三",30),new User("李四",40));
        Collections.sort(users);
        System.out.println(users);
    



/**
 * 用户对象
 *          name
 *          age
 */
class User   implements Comparable<User>

    String name;
    Integer age;

    User(String n, Integer a) 
        name = n;
        age = a;
    

    @Override
    public int compareTo(User u) 
        return this.age - u.age ;
    

    @Override
    public String toString() 
        return String.format("name=%s, age=%d", name, age);
    

 

Comparable优缺点

通过以上案例知道,Comparable的确实现了我们想要的排序结果。但是使用Collections的sort(List<T> list) 方法排序集合时,集合元素必须实现Comparable接口并且定义比较规则。这个时候就开始出现一些问题。比如我们同一个工程使用了User对象,单个场景使用age进行排序,但是另一种情况下使用name排序,这个时候就出现了冲突。并且集合元素需要去实现Comparable接口,这对于我们的代码会有一些"侵入性",也不利于我们后续的代码扩展。

所以一般不建议使用,推荐使用Collections的sort(List<T> list, Comparator<? super T> c)的重载方法。

Comparator用法

Collections的sort(List<T> list, Comparator<? super T> c)

 * 重载的sort方法要求传入一个外部的比较器。
 * 该方法不再要求集合元素必须实现Comparable接口。
 * 并且也不再使用集合元素自身的比较规则排序了,而是根据给定的这个额外的比较器的比较规则,对集合元素进行排序。
 * 实际开发中也推荐使用这种方式排序集合元素,若集合元素是自定义的,创建比较器时也推荐使用匿名内部类的形式。

代码案例一 (自定义对象排序)

package example.demo03;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author yuanchaoyong
 */
public class ComparatorTest03 

    public static void main(String[] args) 
        List<Student> students = Arrays.asList(new Student("张三",30),new Student("李四",40),new Student("王五",50));
        // 使用匿名内部类进行排序
        Collections.sort(students, new Comparator<Student>() 
            @Override
            public int compare(Student o1, Student o2) 
                // 自定义排序规则
                return o1.age- o2.age;
            
        );
        System.out.println(students);
    




class  Student 

    String name;
    Integer age;

    Student(String name, Integer age) 
        this.name = name;
        this.age = age;
    

    @Override
    public String toString() 
        return String.format("name=%s, age=%d", name, age);
    

结果

 

代码案例二 (使用List自带的排序方法)

package example.demo03;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
 * @author yuanchaoyong
 */
public class ComparatorTest03 

    public static void main(String[] args) 
        //test01();
        test02();
    

    /**
     * 使用List自带的排序方法
     */
    private static void test02() 
        List<Student> students = Arrays.asList(new Student("张三",30),new Student("李四",40),new Student("王五",50));
        students.sort(new Comparator<Student>() 
            @Override
            public int compare(Student o1, Student o2) 
                return o1.age- o2.age;
            
        );
        System.out.println(students);
    

    /**
     * Collections.sort方法测试
     */
    private static void test01() 
        List<Student> students = Arrays.asList(new Student("张三",30),new Student("李四",40),new Student("王五",50));
        // 使用匿名内部类进行排序
        Collections.sort(students, new Comparator<Student>() 
            @Override
            public int compare(Student o1, Student o2) 
                // 自定义排序规则
                return o1.age- o2.age;
            
        );
        System.out.println(students);
    


class  Student 
    String name;
    Integer age;
    Student(String name, Integer age) 
        this.name = name;
        this.age = age;
    
    @Override
    public String toString() 
        return String.format("name=%s, age=%d", name, age);
    

 

JDK8之lambda简化写法

Comparator接口是一个函数式接口,所以我们可以使用更优秀的写法,简化代码。

函数式接口就是只定义一个抽象方法的接口。
JDK1.8开始支持默认方法,即便这个接口拥有很多默认方法,只要接口只有一个抽象方法,那么这个接口就是函数式接口。
package example.demo03;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author yuanchaoyong
 */
public class ComparatorTest04 

    public static void main(String[] args) 
        test02();
    

    /**
     * lambda写法测试
     */
    private static void test02() 
        List<Teacher> teachers = Arrays.asList(new Teacher("张三", 30), new Teacher("李四", 40), new Teacher("王五", 50));
        // 多种写法,以下只是作为参考

        // 写法1
        // teachers.stream().sorted((o1,o2)-> o1.age- o2.age).collect(Collectors.toList());

        // 写法2
        //Collections.sort(teachers,(o1,o2)-> o1.getAge()- o2.getAge());

        // 写法3
        List<Teacher> teacherList = teachers.stream().
                sorted((Comparator.comparingInt(Teacher::getAge)))
                .collect(Collectors.toList());

        System.out.println(teachers);
    


class  Teacher 
    String name;
    Integer age;
    Teacher(String name, Integer age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public Integer getAge() 
        return age;
    

    @Override
    public String toString() 
        return String.format("name=%s, age=%d", name, age);
    

额外参考资源

List<类> list; 代表某集合
 
//返回 对象集合以类属性一升序排序
list.stream().sorted(Comparator.comparing(类::属性一));
 
//返回 对象集合以类属性一降序排序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行属性一降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));//以属性一降序
 
//返回 对象集合以类属性一升序 属性二升序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二));
 
//返回 对象集合以类属性一降序 属性二升序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二));//先以属性一升序,升序结果进行属性一降序,再进行属性二升序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二));//先以属性一降序,再进行属性二升序
 
//返回 对象集合以类属性一降序 属性二降序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,升序结果进行属性一降序,再进行属性二降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一降序,再进行属性二降序
 
//返回 对象集合以类属性一升序 属性二降序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,再进行属性二降序

//空/Null数据排序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(item -> item.属性二, Comparator.nullsLast(Date::compareTo))).collect(Collectors.toList());

//空/Null数据分组
Map<String, List<类>> map = list.stream().collect(Collectors.groupingBy(item -> 
  if (item.属性一 == null || item.属性一.equals("")) 
    return "";
  
  return DateFormat.getDateInstance().format(item.属性一);
))

 

 

人要耐得住寂寞,才能守得住繁华。人生最痛苦的就是拿不起放不下,不属于自己的快乐,及时放手也许是一种解脱,生活中没有谁对谁错,只有适不适合。当发现很多已经改变,更要面对的是事实。

以上是关于JAVA中List集合的汉字排序的主要内容,如果未能解决你的问题,请参考以下文章

Java对List集合的排序

Java:List集合内的对象进行排序

Java 中List集合中自定义排序

java中list集合的内容,如何使用像数据库中group by形式那样排序

java 集合(顺序,混乱,倒序)排序

java 集合(顺序,混乱,倒序)排序