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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李亚飞 中级黑马   /  2012-12-18 12:02  /  1429 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李亚飞 于 2012-12-18 17:48 编辑

package collection;
import java.util.*;
public class TreeSetDemo2 {
   /**
   * 有个学生类:包含姓名和年龄。根据年龄从小到大排序(如果年龄相等 则按姓名排序)。
   * 若姓名是字母的时候可以按字母排序,
   * 若姓名是中文的时候该如何排序?
   */
   public static void main(String[] args) {
            meth_1();
   }
   public static void meth_1()
   {
        //传入比较器对象 new MyComparator()
         TreeSet<Students> ts = new TreeSet<Students>(new MyComparator());
          ts.add(new Students("lisi",21));
          ts.add(new Students("zhangsan",20));
          ts.add(new Students("along",21));
          ts.add(new Students("admin",21));
           ts.add(new Students("maer",23));
  
          /* 若是中文该如何排序?
             ts.add(new Students("李四",21));
             ts.add(new Students("张三",20));
             ts.add(new Students("阿龙",21));
             ts.add(new Students("管理员",21));
             ts.add(new Students("马二",23));
          */
  
       //迭代器
         Iterator<Students> it = ts.iterator();
           while(it.hasNext())
          {
                 Students s = it.next();
                 System.out.println("姓名:"+s.getName()+"\t年龄"+s.getAge());
           }
      }
}
class Students   //学生类 :姓名 年龄
{
       private String name ;
       private int age ;
       public String getName() {
             return name;
       }
      public void setName(String name) {
              this.name = name;
       }
      public int getAge() {
             return age;
      }
      public void setAge(int age) {
            this.age = age;
      }
      Students(String name,int age) {
             this.name = name;
             this.age = age;
      }
}
//比较器
class MyComparator implements Comparator<Students>
{
      public int compare(Students  s1,Students s2)
      {
            //根据年龄排序
             int num = new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
             if(num==0) //如果年龄相对 则按姓名排序
                       return num = s1.getName().compareTo(s2.getName()) ;  
              return num ;
       }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
汉字最早是GB2312编码,收录了六千多个汉字,是按拼音排序的,编码是连续的。 后来出现了GBK编码,对GB2312进行了扩展,到了两万多汉字,并且兼容GB2312,也就是说GB2312中的汉字编码是原封不动搬到GBK中的(在GBK编码中[B0-D7]区中)。
如果我们只关心这6000多个汉字的顺序,就可以用下面的方法实现汉字宽松排序。
  1. package chinese.utility;
  2. import java.text.Collator;
  3. import java.util.Comparator;
  4. import java.util.Locale;
  5. public class PinyinSimpleComparator implements Comparator<String> {
  6.     public int compare(String o1, String o2) {
  7.         return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
  8.     }
  9. }
复制代码
参见这个连接的详细讲解
http://www.blogjava.net/jeff-lau/archive/2007/12/21/169257.html
回复 使用道具 举报
简体中文中我们使用比较多的字符集是 GB2312-80,简称为 GB2312,这个字符集包含了目前最常用的汉字共计 6736 个。其中的汉字分为两大类:常用汉字和次常用汉字。常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。
对于汉字排序的原理我懂一些,对于这个代码说实话具体的我解释不太清楚,但是确实可以实现,希望对你有帮助!
实现代码:
  1.     import java.util.*;
  2.   import java.text.*;
  3.   public class Test
  4.   {
  5.   String [] test = new String [] {"李四" ,"张三" ,"tom" ,"学生" };
  6.   java.util.Arrays .sort(test, new ChineseGB2312Comparator());
  7.   System .out.println("============" );
  8.   for (String key : test)
  9.   System .out.println(key);
  10.   }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马