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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 于汝国 于 2011-12-21 23:06 编辑

TreeSet的内容是允许进行排序的,但是对于一个普通的类对象是不能向TreeSet集合中加入的,那么、如何在TreeSet集合中实现对普通类对象的排序操作呢?

评分

参与人数 2技术分 +2 收起 理由
杨强 + 1
王德云 + 1

查看全部评分

7 个回复

倒序浏览
这是实现自定义treeset排序的一个类代码,请参考一下
package com.shengsiyuan2;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest3
{
        public static void main(String[] args)
        {
                TreeSet set = new TreeSet(new MyComparator());
               
                set.add("C");
                set.add("A");
                set.add("B");
                set.add("E");
                set.add("a");
                set.add("F");
                set.add("D");
               
                for(Iterator iter = set.iterator(); iter.hasNext();)
                {
                        String value = (String)iter.next();
                       
                        System.out.println(value);
                                       
                }
               
        }
}


class MyComparator implements Comparator
{
        public int compare(Object arg0, Object arg1)
        {
                String s1 = (String)arg0;
                String s2 = (String)arg1;
               
                return s2.compareTo(s1);
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
普通类实现了Comparable接口
回复 使用道具 举报
恩 对呀  
因为 你是对类进行比较的呀
嘿嘿
好好想想 ,好好分析一下代码额  
回复 使用道具 举报
方法一:元素实现Comparable接口,重写compareTo()方法,实现集合排序
方法二:定义一个比较器传给TreeSet的构造函数,该比较器实现Comparator接口,重写compare()方法,实现集合排序
  1. import java.util.TreeSet;
  2. import java.util.Iterator;
  3. import java.util.Comparator;

  4. /**
  5. 1.实现Comparable接口,重写compareTo()方法,实现集合排序
  6. */
  7. class Student implements Comparable
  8. {
  9.   String name;
  10.   int age;
  11.   Student(String name, int age)
  12.   {
  13.           this.name=name;
  14.           this.age=age;       
  15.   }     
  16.   public int compareTo(Object obj)
  17.   {
  18.                   if(!(obj instanceof Student))
  19.                           throw new RuntimeException("不是学生对象");
  20.                   Student o = (Student)obj;
  21.                   if(this.age==o.age)
  22.                           return this.name.compareTo(o.name);
  23.                   else if(this.age>o.age)
  24.                           return 1;
  25.                   else
  26.                           return -1;
  27.   }
  28.   public String toString()
  29.   {
  30.                   return this.name+"-"+this.age;       
  31.   }
  32. }

  33. class Test
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 TreeSet<Student> ts = new TreeSet<Student>();
  38.                 ts.add(new Student("John",20));
  39.                 ts.add(new Student("Jack",20));
  40.                 ts.add(new Student("Jam",21));
  41.                
  42.                 Iterator<Student>it = ts.iterator();
  43.                 while(it.hasNext())
  44.                 {
  45.                         System.out.println(it.next());       
  46.                 }
  47.                
  48.                 /**
  49.                 2.(匿名内部类的方式)实现Comparator接口,重写compare()方法,实现集合排序
  50.                 */
  51.                 TreeSet<Student> ts2 = new TreeSet<Student>(
  52.                 new Comparator<Student>()
  53.                 {
  54.                         public int compare(Student sa, Student sb)
  55.                         {
  56.                                 if(sa.age==sb.age)
  57.                                   return sa.name.compareTo(sb.name);
  58.                           else if(sa.age>sb.age)
  59.                                   return 1;
  60.                           else
  61.                                   return -1;
  62.                         }
  63.                 }
  64.                 );
  65.                
  66.                 ts2.add(new Student("John",20));
  67.                 ts2.add(new Student("Jack",20));
  68.                 ts2.add(new Student("Jam",21));
  69.                 System.out.println();       
  70.                
  71.                 Iterator<Student>it2 = ts2.iterator();
  72.                 while(it2.hasNext())
  73.                 {
  74.                         System.out.println(it2.next());       
  75.                 }
  76.   }
  77. }
复制代码
测试结果:
  1. Jack-20
  2. John-20
  3. Jam-21

  4. Jack-20
  5. John-20
  6. Jam-21
复制代码

评分

参与人数 1技术分 +2 收起 理由
杨强 + 2

查看全部评分

回复 使用道具 举报
TreeSet sortedResults = new TreeSet(
new Comparator(){
public int compare(Object o1, Object o2) {
     // TODO Auto-generated method stub
        User user1 = (User)o1;
        User user2 = (User)o2;
/*如果compareTo返回结果0,则认为两个对象相等,新的对象不
会增加到集合中去
* 所以,不能直接用下面的代码,否则,那些个数相同的其他姓
名就打印不出来。
* */
//return user1.value-user2.value;
//return
        user1.value<user2.value?-1:user1.value==user2.value?0:1;
       if(user1.value<user2.value)
       {
            return -1;
       }else if(user1.value>user2.value) {
          return 1;
      }else{
     return user1.name.compareTo(user2.name);
    }
   }
}

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
于汝国 黑马帝 2011-12-21 23:05:02
7#
谢谢各位!明白了,嘻嘻!黑马这是个温暖的大家庭!
回复 使用道具 举报
于汝国 黑马帝 2011-12-21 23:05:21
8#
谢谢各位!明白了,嘻嘻!黑马这是个温暖的大家庭!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马