欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java对中文进行排序的实现示例,

来源: javaer 分享于  点击 40386 次 点评:169

Java对中文进行排序的实现示例,


目录
  • 一、Java排序
    • 1、实现 Comparable接口
    • 2、实现 Comparator接口
  • 二、中文排序
    • 三、中文多音字排序

      一、Java排序

      Java中类通常实现 Comparable接口或者 Comparator接口进行排序。

      1、实现 Comparable接口

      1)我们的类 实现 Comparable接口,重写 compareTo方法来实现升序和降序。

      注意:关于升序和降序,简单的改一下 compareTo方法的比较符号即可。

      @Data
      @ToString
      public class User implements Comparable<User> {
      
          private Long id;
      
          private String userName;
      
          private int age;
      
          public User(Long id, String userName, int age) {
              this.id = id;
              this.userName = userName;
              this.age = age;
          }
      
          /**
           * 按照age进行排序
           * 如果传参 age比本身的 age小的话,返回1,升序
           * 如果传参 age比本身的 age大的话,返回-1,降序
           *
           * @param o
           * @return
           */
          @Override
          public int compareTo(User o) {
              if (this.getAge() > o.getAge()) {
                  return 1;
              } else if (this.getAge() == o.getAge()) {
                  return 0;
              } else {
                  return -1;
              }
          }
      }   
      

      2)业务中通过调用 Collections.sort(List list);方法集合完成排序。

          public static void main(String[] args) {
              sortAge();
          }
      
          private static void sortAge() {
              List<User> userList = new ArrayList<User>();
              userList.add(new User(1L, "赵云", 20));
              userList.add(new User(2L, "赵子龙", 19));
              userList.add(new User(3L, "安琪拉", 18));
              userList.add(new User(4L, "露娜", 17));
              userList.add(new User(5L, "妲己", 19));
              userList.add(new User(6L, "重量", 16));
              userList.add(new User(7L, "重庆", 21));
              System.out.println("排序之前:");
              for (User user : userList) {
                  System.out.println(user);
              }
              Collections.sort(userList);
              System.out.println("排序之后:");
              for (User user : userList) {
                  System.out.println(user);
              }
          }
      

      在这里插入图片描述

      2、实现 Comparator接口

      1)我们的类 实现 Comparator接口,重写 compare方法来实现升序和降序。

      @Data
      @ToString
      public class User2 {
      
          private Long id;
      
          private String userName;
      
          private int age;
      }
      
      public class UserNameSort implements Comparator<User2> {
      
          @Override
          public int compare(User2 o1, User2 o2) {
              return o1.getUserName().compareTo(o2.getUserName());
          }
      }
      

      2)业务中通过调用 Collections.sort(List list, Comparator<? super T> c);方法集合完成排序。

      注意:1)可以不用写,我们通过定义它们的匿名内部类来实现排序。

          public static void main(String[] args) {
              sortUserName();
          }
      
          private static void sortUserName() {
              List<User2> userList = new ArrayList<User2>();
              userList.add(new User2(1L, "赵云", 20));
              userList.add(new User2(2L, "赵子龙", 19));
              userList.add(new User2(3L, "安琪拉", 18));
              userList.add(new User2(4L, "露娜", 17));
              userList.add(new User2(5L, "妲己", 19));
              userList.add(new User2(6L, "重量", 16));
              userList.add(new User2(7L, "重庆", 21));
              System.out.println("排序之前:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
      
              HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
              Collections.sort(userList, new UserNameSort());
              System.out.println("排序之后:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
          }
      

      在这里插入图片描述


      发现中文排序是不对的。因为汉字在Unicode中编码和汉字GB2312编码或者拼音是不一样。

      二、中文排序

      下面直接使用 Comparator接口的匿名内部类来实现排序。

      Java 提供了一个Collator.getInstance(java.util.Locale.CHINA);通过它可以简单实现中文排序。

      注意:汉字博大精深,对于多音字等,它的排序是不精准的。

         private static void sortUserName2() {
              List<User2> userList = new ArrayList<User2>();
              userList.add(new User2(1L, "赵云", 20));
              userList.add(new User2(2L, "赵子龙", 19));
              userList.add(new User2(3L, "安琪拉", 18));
              userList.add(new User2(4L, "露娜", 17));
              userList.add(new User2(5L, "妲己", 19));
              userList.add(new User2(6L, "重量", 16));
              userList.add(new User2(7L, "重庆", 21));
              System.out.println("排序之前:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
      
              HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
              Collections.sort(userList, new Comparator<User2>() {
                  @Override
                  public int compare(User2 o1, User2 o2) {
                      Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA);
                      return compare.compare(o1.getUserName(), o2.getUserName());
                  }
              });
              System.out.println("排序之后:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
          }
      

      在这里插入图片描述

      三、中文多音字排序

      pinyin4j 是一个流行的 Java 库,支持汉字和最流行的拼音系统之间的转换。拼音的输出格式也可以自定义。

      pinyin4j的主页:http://pinyin4j.sourceforge.net/

      • 支持简体中文和繁体中文字符;
      • 支持转换到汉语拼音,通用拼音等;
      • 支持多音字,即可以获取一个中文字符的多种发音;
      • 支持多种字符串输出格式。

      1)引入依赖

              <dependency>
                  <groupId>com.belerweb</groupId>
                  <artifactId>pinyin4j</artifactId>
                  <version>2.5.1</version>
              </dependency>
      

      2)中文拼音排序

         private static void sortUserName3() {
              List<User2> userList = new ArrayList<User2>();
              userList.add(new User2(1L, "赵云", 20));
              userList.add(new User2(2L, "赵子龙", 19));
              userList.add(new User2(3L, "安琪拉", 18));
              userList.add(new User2(4L, "露娜", 17));
              userList.add(new User2(5L, "妲己", 19));
              userList.add(new User2(6L, "重量", 16));
              userList.add(new User2(7L, "重庆", 21));
              System.out.println("排序之前:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
      
              HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
              Collections.sort(userList, new Comparator<User2>() {
                  @Override
                  public int compare(User2 o1, User2 o2) {
                      String pinyin1 = null;
                      String pinyin2 = null;
                      try {
                          pinyin1 = PinyinHelper.toHanYuPinyinString(o1.getUserName(), pinyinOutputFormat, " ", true);
                          pinyin2 = PinyinHelper.toHanYuPinyinString(o2.getUserName(), pinyinOutputFormat, " ", true);
                          System.out.println("pinyin1=" + pinyin1 + ", pinyin2=" + pinyin2);
                      } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                          badHanyuPinyinOutputFormatCombination.printStackTrace();
                      }
                      return pinyin1.compareTo(pinyin2);
                  }
              });
              System.out.println("排序之后:");
              for (User2 user : userList) {
                  System.out.println(user);
              }
          }
      

      在这里插入图片描述

      针对 PinyinHelper.toHanYuPinyinString()获取拼音的方法,自己可封装成 工具类。

      到此这篇关于Java对中文进行排序的实现示例的文章就介绍到这了,更多相关Java 中文排序内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

      您可能感兴趣的文章:
      • Java使用Collections.sort对中文进行排序方式
      • Java自定义比较器实现中文排序
      • Java 中文字符按Unicode排序的实现方法
      • Java实现对中文字符串的排序功能实例代码
      • Java实现按中文首字母排序的具体实例
      相关栏目:

      用户点评