黑马程序员技术交流社区
标题:
TreeSet中的一个问题,一点延伸问题,求解
[打印本页]
作者:
彭波
时间:
2013-3-14 15:58
标题:
TreeSet中的一个问题,一点延伸问题,求解
/*
毕老师,第15天——02的视频
需求:往TreeSet集合中存储自定义对象学生
想按照学生的年龄进行排序
*/
import java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02", 22));//建立对象,并传入参数
ts.add(new Student("lisi007", 20));
ts.add(new Student("lisi09", 19));
ts.add(new Student("lisi01",19));
//ts.add(new Student("lisi01",19));//年龄和姓名与上面的相同,视为同一个人,无法存入并输出
Iterator it = ts.iterator();
while(it.hasNext())
{
Student stu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class Student implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name, int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
System.out.println(this.name+"...compareto..."+s.name);//输出比较过程
if(this.age>s.age)
return 1;
if(this.age==s.age)//当年龄相同时,按照姓名排序
{
return this.name.compareTo(s.name);
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
注意:以上代码是假设有相同年龄和姓名的人视为
同一个人
,年龄相同则按姓名排序,
我的疑惑:
现实生活中有许多年龄和姓名一样的人,但
不是同一个人
,
试问:该怎么排序?我想从上面的程序进行修改,但是相同年龄和姓名的人视为
同一个人,
无法存入并输出,还有什么其他办法?
作者:
白堇翎
时间:
2013-3-14 16:11
本帖最后由 白堇翎 于 2013-3-14 17:14 编辑
Set接口本身就是为了存储不重复的元素而存在的
假如你一定要用Set接口的话..
那可以给每个人加一个身份证号码 就可以实现这种功能了
package Test;
import java.util.Iterator;
import java.util.TreeSet;
public class IDDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02", 22, 1001));// 建立对象,并传入参数
ts.add(new Student("lisi007", 20, 1002));
ts.add(new Student("lisi09", 19, 1003));
ts.add(new Student("lisi01", 19, 1004));
ts.add(new Student("lisi01", 19, 1005));// 年龄和姓名与上面的相同,视为同一个人,无法存入并输出
Iterator it = ts.iterator();
while (it.hasNext()) {
Student stu = (Student) it.next();
System.out.println(stu.getName() + "..." + stu.getAge() + "...."
+ stu.getID());
}
}
}
class Student implements Comparable // 该接口强制让学生具备比较性
{
private String name;
private int age;
private int ID;
Student() {
super();
}
Student(String name, int age, int ID) {
super();
this.name = name;
this.age = age;
this.ID = ID;
}
public int compareTo(Object obj) {
if (!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student) obj;
System.out.println(this.name + "...compareto..." + s.name);// 输出比较过程
if ( this.age > s.age)
return 1;
if ((this.ID == s.ID) && (this.age == s.age))// 当年龄相同时,按照姓名排序
{
return this.name.compareTo(s.name);
}
return -1;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setID(int ID) {
this.ID = ID;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getID() {
return ID;
}
}
复制代码
这是修改后的代码
作者:
彭波
时间:
2013-3-14 18:07
王芝 发表于 2013-3-14 16:41
楼上说的好啊,或者再加个学号也行,呵呵。
学号一般不会相同的,
作者:
郝强勇
时间:
2013-3-16 07:35
首先说,毕老师的这段代码只是一种假设,在实际情况中确实不可能是这样的,那么在实际情况中是按照身份证的唯一性判断的,所以你不必纠结在这段代码上,因为这段TreeSet的示例仅仅是为你展现了怎样实现TreeSet排序的内部原理而已,如果你想符合实际情况,大可自己再编这段代码的时候把身份证作为Person的一个属性,那样就符合实际情况了啊。这不是技术问题,是常识问题,但愿你能理解。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2