黑马程序员技术交流社区
标题:
Comparator和TreeSet的问题
[打印本页]
作者:
郝福明
时间:
2012-12-24 22:13
标题:
Comparator和TreeSet的问题
本帖最后由 郝福明 于 2012-12-25 16:07 编辑
Comparator和TreeSet这两个方法怎么用呢
package com.myhfm;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Test10 {
public static void main(String[] args) {
TreeSet<Students>students1 = new TreeSet<Students>();
students1.add(new Students("郝福明1",34));
students1.add(new Students("郝福明2",40));
students1.add(new Students("郝福明3",64));
students1.add(new Students("郝福明4",20));
students1.add(new Students("郝福明5",24));
Iterator iter = students1.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
class Students{
String name;
int score;
public Students(){}
public Students(String name, int score) {
this.name = name;
this.score = score;
}
}
复制代码
作者:
翁鹏
时间:
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