黑马程序员技术交流社区

标题: Comparator和TreeSet的问题 [打印本页]

作者: 郝福明    时间: 2012-12-24 22:13
标题: Comparator和TreeSet的问题
本帖最后由 郝福明 于 2012-12-25 16:07 编辑

Comparator和TreeSet这两个方法怎么用呢
  1. package com.myhfm;

  2. import java.util.ArrayList;
  3. import java.util.Comparator;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.TreeSet;

  8. public class Test10 {
  9.         public static void main(String[] args) {
  10.                
  11.                 TreeSet<Students>students1 = new TreeSet<Students>();
  12.                 students1.add(new Students("郝福明1",34));
  13.                 students1.add(new Students("郝福明2",40));
  14.                 students1.add(new Students("郝福明3",64));
  15.                 students1.add(new Students("郝福明4",20));
  16.                 students1.add(new Students("郝福明5",24));
  17.                 Iterator iter = students1.iterator();
  18.                 while(iter.hasNext()){
  19.                         System.out.println(iter.next());
  20.                 }
  21.                
  22.         }

  23. }
  24. class Students{
  25.         String name;
  26.         int score;
  27.         public Students(){}
  28.         public Students(String name, int score) {
  29.                 this.name = name;
  30.                 this.score = score;
  31.         }
  32.         
  33. }
复制代码

作者: 翁鹏    时间: 2012-12-24 23:26
你的问题出现了个小小的问题 Comparator和TreeSet这两个方法怎么用呢

这不是两个方法 Comparator是一个接口, TreeSet是一个类。
建议看毕老师的第15天视频, 视频里讲的很详细。
作者: 郭俊    时间: 2012-12-24 23:52
   同学,你的意思是说 TreeSet和 Comparator怎么连一块用吗?  
  不是的话,请更正问题
  是的话:
     你要搞清楚,TreeSet有两种方式保证它的元素的唯一性。
                      1)让元素具备比较性:元素对象实现Comparable接口的compareTo方法
                                2)比较器接口:也就是实现Comparator接口的compare方法。 这就是TreeSet和Comparator的关系。
    TreeSet一般只有在要排序的情况下用它,不然就用HashSet。
     

作者: 冯伟超    时间: 2012-12-25 02:39
本帖最后由 冯伟超 于 2012-12-25 02:46 编辑

楼主我真不明白,你是不是向集合中添加字符串和添加自定义对象没分清出啊
首先你的程序问题太多了:
1.你的Students类中的,就只有构造函数,没有set和get方法。好吧,我承认。没有这些方法,也可以。
   但是你总的重写Object类的toString方法吧。或是你自定一个方法来让你这个类在调用的时候能输出
   一些信息对吧。除非你想看的是对象在内存中的地址值。那你的想法需求在这里就没意思了
2.在集合中这样的迭代自定义对象,我想,你还没认真的看老师的视频、
   给自己一点耐心,这样的问题就不会发生了!

3.关于Comparator的使用,这是一个接口,让集合本身具有比较的功能,这时将它作为一个参数传到TreeSet集合的构造函数中来实现它有两种方式
    一种:通过匿名内部类来实现comparator中的方法。
   第二种:通过自定义类来实现comparetor,让后将子类类的对象TreeSet构造函数的参数。
  那么怎么让该集合进行比较,这个得看你怎么实现了。你想实现的排序的功能,都是在compareto方法中实现的,所以在重写它的方法是,在
方法体内,就看你自己的运用了!

作者: 郝福明    时间: 2012-12-25 08:16
不好意思啊,没说清楚,“定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性,创建5个对象, 属性可为任意值. 编程对这5个对象按成绩排序,并将结果输出。(提示,用TreeSet和Comparator实现).”这是题目。不好意思啊,我以前下的毕老师的视频只有从第十八天开始的,刚才找到了
作者: 黄锦成    时间: 2012-12-25 08:55
给个例子给你参考
package com.itheima;
import java.util.*;
/**
* 定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性,创建5个对象, 属性可为任意值.
* 编程对这5个对象按成绩排序,并将结果输出。(提示,用TreeSet和Comparator实现)
* @author Administrator
*/
public class Test10
{
        public static void main(String args[])
        {
                //让集合自身具备比较性
                Set<Student> set = new TreeSet<Student>(new Comparator<Student>(){
                        public int compare(Student student1,Student student2)
                        {
                                //这条语句可能返回负数,正数或0
                                int result = student1.getScore()-student2.getScore();
                                //1、分数相同,就用年龄排序
                                if(result==0)
                                {
                                        result = student1.getAge()-student2.getAge();
                                        //2、如果年龄也相同,那就用名字排序
                                        if (result==0)
                                        {
                                                //3、如果名字也相同,那么就是三个属性相同,即为同一个人了
                                                result = student1.getName().compareTo(student2.getName());
                                        }
                                }
                                return result;
                        }
                });
               
                //添加学生
                set.add(new Student("张三",30,300));
                set.add(new Student("王五",50,500));
                set.add(new Student("李四",40,400));
                set.add(new Student("赵六",70,700));
                set.add(new Student("孙七",70,700));

                set.add(new Student("孙七",70,700));//这个存不进去
               
                //set.size()获取集合元素的个数
                System.out.println("共有"+set.size()+"个学生");
                //遍历
                for (Iterator<Student> it = set.iterator(); it.hasNext(); )
                {
                        System.out.println(it.next());
                }
        }
}

/**
* 学生类
* @author Administrator
*/
class Student
{
        private String name;//名字
        private int age;//年龄
        private int score;//分数
       
        //实例化对象时,就初始化这三个属性
        Student(String name, int age, int score)
        {
                this.name = name;
                this.age = age;
                this.score = score;
        }
        //为三个私有属性向外部提供访问方法
        public String getName()
        {
                return this.name;
        }
        public int getAge()
        {
                return this.age;
        }
        public int getScore()
        {
                return this.score;
        }
        //覆写toString方法
        public String toString()
        {
                return this.name+"---"+this.age+"----"+this.score;
        }
}
作者: 郝福明    时间: 2012-12-26 16:32
黄锦成 发表于 2012-12-25 08:55
给个例子给你参考
package com.itheima;
import java.util.*;

太感谢了,明白是怎么回事了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2