A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-16 10:10  /  2199 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

如果在集合中放入中文,如何将他们按照拼音进行排序,比如List,希望能详解

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

8 个回复

正序浏览
谢谢楼上的各位
回复 使用道具 举报
黑马刘涛 发表于 2012-7-16 11:32
lsss ,你的排序不能实现按中文拼音顺序排序

好像是不行,记得以前直接比较字符串是可以按拼音排序啊
不过java.text下面有现成比较器
  1. import java.util.*;
  2. import java.text.*;

  3. public class demo{
  4.         public static void main(String args[]){
  5.                 List<String> list = new ArrayList<String>();
  6.                
  7.                 Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);

  8.                 list.add("王五");
  9.                 list.add("李四");
  10.                 list.add("张三");

  11.                 Collections.sort(list, cmp);

  12.                 System.out.println(list);
  13.         }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
ls的,你直接说他的楼号撒
回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-16 11:34 编辑

lsss ,你的排序不能实现按中文拼音顺序排序
回复 使用道具 举报
本帖最后由 101259@qq.com 于 2012-7-16 11:57 编辑

1、定义一个类,存放汉字和其拼音两个字段,在这个类里面实现Comparable接口,内部按照其拼音比较

2、代码
  1. import java.util.Collections;
  2. import java.util.LinkedList;
  3. import java.util.List;

  4. public class ChineseDemo {
  5.         public static void main(String[] args) {
  6.                 List<Chinese>list=new LinkedList<Chinese>();
  7.                 Chinese c1=new Chinese("张三","zhangsan");
  8.                 Chinese c2=new Chinese("李四","lisi");
  9.                 Chinese c3=new Chinese("王五","wangwu");
  10.                 list.add(c1);
  11.                 list.add(c2);
  12.                 list.add(c3);
  13.                
  14.                 //①排序前:
  15.                 System.out.print("排序前:");
  16.                 for(Chinese c:list){
  17.                         System.out.print(c.getHanzi()+",");
  18.                 }
  19.                
  20.             //对集合排序
  21.                 System.out.println();
  22.                 System.out.print("排序后:");
  23.                
  24.                 Collections.sort(list);
  25.                 for(Chinese c:list){
  26.                         System.out.print(c.getHanzi()+",");
  27.                 }
  28.                
  29.         }

  30. }
  31. /*
  32.   * 写一个类,定义两个字段,分别存放汉字和对应的拼音,
  33.   * 并实现Comparable,内部按照他们的拼音比较,
  34.   */

  35. class Chinese implements Comparable<Chinese>{
  36.        
  37.         private String hanzi;
  38.         private String pinyin;
  39.         public Chinese(String hanzi,String pinyin){
  40.                 this.hanzi=hanzi;
  41.                 this.pinyin=pinyin;
  42.         }
  43.         public String getHanzi() {
  44.                 return hanzi;
  45.         }
  46.         public void setHanzi(String hanzi) {
  47.                 this.hanzi = hanzi;
  48.         }
  49.         public String getPinyin() {
  50.                 return pinyin;
  51.         }
  52.         public void setPinyin(String pinyin) {
  53.                 this.pinyin = pinyin;
  54.         }
  55.     //实现compareTo方法,按照Chinese的pinyin比较
  56.         @Override
  57.         public int compareTo(Chinese o) {
  58.                 if(this.pinyin.compareTo(o.getPinyin())>0){
  59.                         return 1;       
  60.                 }else if(this.pinyin.compareTo(o.getPinyin())==0){
  61.                         return 0;
  62.                 }else{
  63.                         return -1;
  64.                 }
  65.         }

  66.        
  67. }
复制代码
3、打印结果:可以多添加几个元素,自己试一试


4、我写的代码里面,每次都要将汉字的拼音手动添加进去,你有兴趣的话,看一看
pinyin4j.jar
这个开发包,可以通过汉字获取其拼音,就不用每次手工写拼音了



评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-16 11:33 编辑
  1. import java.util.*;
  2. import java.text.*;
  3. public class StringTest {

  4.         public static void main(String args[]){
  5.         Personnel p1 = new Personnel("张三");
  6.         Personnel p2 = new Personnel("李四");
  7.         Personnel p3 = new Personnel("王五");
  8.         Personnel p4 = new Personnel("赵六");
  9.         
  10.         myComparator cmp = new myComparator();
  11.         List<Personnel> strList = new ArrayList<Personnel>();
  12.         strList.add(p1);
  13.         strList.add(p2);
  14.         strList.add(p3);
  15.         strList.add(p4);
  16.         System.out.println("排序前:\n" + strList);
  17.         Collections.sort(strList,cmp);
  18.         System.out.println("排序后:\n" + strList);
  19.         }
  20. }

  21. //个人类
  22. class Personnel{
  23.         private String name;     // 姓名
  24.         public Personnel(String name){
  25.                 this.name = name;
  26.         }

  27.         public Personnel(){
  28.         }

  29.         // 重写 toString()方法
  30.         public String toString(){
  31.                 return this.name;
  32.         }

  33.         
  34.         public String getName() {
  35.                 return name;
  36.         }
  37.         public void setName(String name) {
  38.                 this.name = name;
  39.         }
  40. }
  41. //用来排序的比较器类
  42. class myComparator implements Comparator{
  43.         // Collator类定义
  44.         // Collator 类执行区分语言环境的 String 比较。使用此类可为自然语言文本构建搜索和排序例程。
  45.         //Collator 类是用来执行区分语言环境的 String 比较的,这里选择使用CHINA
  46.         //已实现的接口Comparator<Object>
  47.         Collator collatorChina = Collator.getInstance(java.util.Locale.CHINA);  // 用于将中文按拼音排序
  48.         public int compare(Object o1, Object o2) {
  49.                 // 要求姓名排序
  50.                 Personnel p1 = (Personnel) o1;
  51.                 Personnel p2 = (Personnel) o2;
  52.          
  53.                 // 姓名
  54.                 String name1 = p1.getName();
  55.                 String name2 = p2.getName();
  56.                 return collatorChina.compare(name1,name2); //Collator方法compare,将实现按指定语言环境两个参数的比较
  57.         }
  58. }



复制代码
public static Collator getInstance(Locale desiredLocale)获取所需语言环境的 Collator。如: Collator usCollator = Collator.getInstance(Locale.US);
也是通过查API写的,实现了按中文字符串拼音顺序的排序。

捕获.PNG (12.25 KB, 下载次数: 59)

捕获.PNG

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 何旭栋 于 2012-7-16 11:42 编辑

自定义一个比较器,以字符串比较返回,再用Collections工具类中sort方法传入改比较器就可以排序

  1. import java.util.*;

  2. class StrComparator implements Comparator<String>{
  3.         public int compare(String s1,String s2){
  4.                 return s2.compareTo(s1);
  5.         }
  6. }

  7. class demo {
  8.         public static void main(String[] args) {
  9.                 List<String> list = new ArrayList<String>();

  10.                 list.add("张三");
  11.                 list.add("李四");
  12.                 list.add("王五");

  13.                 Collections.sort(list, new StrLenComparator());
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在java里写中文,容易出问题哦,我写个按拼音名称的排序
因为TreeSet可以对set集合中的元素进行排序(ascii码表),元素是无序的,也不会重复,这里以TreeSet为例
  1. import java.util.*;
  2. class TreeSetTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet<Student> ts = new TreeSet<Student>();
  7.                 ts.add(new Student("zhangsan"));
  8.                 ts.add(new Student("lisi"));
  9.                 ts.add(new Student("wangming"));
  10.                 ts.add(new Student("test"));

  11.                 Iterator<Student> it = ts.iterator();
  12.                 while(it.hasNext())
  13.                 {
  14.                         Student s = it.next();
  15.                         System.out.println(s.getName());
  16.                 }
  17.         }
  18. }
  19. class Student implements Comparable//该接口强制让学生具备比较性
  20. {
  21.         private String name;
  22.        

  23.         public int compareTo(Object obj)
  24.         {
  25.                 if(!(obj instanceof Student))
  26.                         throw new RuntimeException("不是Student类对象");
  27.                 Student s = (Student)obj;
  28.                
  29.                 return this.name.compareTo(s.name);
  30.                
  31.         }
  32.         Student(String name)
  33.         {
  34.                 this.name = name;
  35.                
  36.         }
  37.         public String getName()
  38.         {
  39.                 return name;
  40.         }
  41. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马