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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张振纲 中级黑马   /  2012-8-8 11:37  /  1944 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 每一个学生都有对应的归属地。
  3. 学生Student,地址String。
  4. 学生属性:姓名,年龄。
  5. 注意:姓名和年龄相同的视为同一个学生。
  6. 保证学生的唯一性。



  7. 1,描述学生。
  8. 定义一个类,通过构造函数描述学生的姓名和年龄

  9. 2,定义map容器。将学生作为键,地址作为值。存入。
  10. 使用HashMap将学生作为键存入,地址作为值存入

  11. 3,获取map集合中的元素。
  12. 建立Set获取map中键,然后调用方法获取值即可

  13. @author 张振纲
  14. */
  15. import java.util.*;
  16. class Student implements Comparable<Student>
  17. {
  18. private String name;
  19. private int age;
  20. Student(String name,int age)
  21. {
  22. this.name = name;
  23. this.age = age;
  24. }

  25. public int hashcode()
  26. {
  27. return name.hashCode()+age*34;
  28. }

  29. public int compareTo(Student stu)
  30. {
  31. return new Integer (this.age) .compareTo( new Integer (stu.age));
  32. }

  33. public boolean equals(Object obj)
  34. {
  35. if (!(obj instanceof Student))
  36. {
  37. throw new RuntimeException("类型不匹配");
  38. }
  39. Student s = (Student)obj;

  40. return this.name.equals(s.name)&&this.age==s.age;
  41. }

  42. public String getName()
  43. {
  44. return name;
  45. }

  46. public int getAge()
  47. {
  48. return age;
  49. }
  50. }

  51. class MapTest
  52. {
  53. public static void main(String[] args)
  54. {
  55. HashMap<Student,String> map = new HashMap<Student,String>(); //将学生作为键存入,将地址作为值存入

  56. map.put(new Student("zhangsan1",17),"beijing");
  57. map.put(new Student("zhangsan2",14),"tianjing");
  58. map.put(new Student("zhangsan5",14),"tianjing");
  59. map.put(new Student("zhangsan3",11),"nanjing");
  60. map.put(new Student("zhangsan4",16),"datong");
  61. map.put(new Student("zhangsan4",16),"datong");


  62. Set<Student> s = map.keySet();

  63. Iterator<Student> it = s.iterator();

  64. while (it.hasNext())
  65. {
  66. Student stu = it.next();
  67. System.out.println(stu.getName()+"---"+stu.getAge()+"----"+map.get(stu));
  68. }
  69. }

  70. }
复制代码
以上这段代码需求的写很清楚
思路我也标明了
我想通过TreeMap存入数据,并且按年龄排序

我复写了Comparable的compareTo方法,使对象自身具备比较性
可是为什么现在按年龄排序了,但是不会排除重复元素

到底该怎么做,求指导

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

7 个回复

倒序浏览
补上运行结果图
回复 使用道具 举报
/*
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。



1,描述学生。
定义一个类,通过构造函数描述学生的姓名和年龄

2,定义map容器。将学生作为键,地址作为值。存入。
使用HashMap将学生作为键存入,地址作为值存入

3,获取map集合中的元素。
建立Set获取map中键,然后调用方法获取值即可

@author 张振纲
*/
import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}

public int hashcode()//首先这里你把hashCode写错了,C写成小些了,也就是你没有覆盖父类的hashCode方法,系统还是用父类的hashCode方法进行比较
{
return name.hashCode()+age*34;
}

public int compareTo(Student stu)
{
return new Integer (this.age) .compareTo( new Integer (stu.age));
}

public boolean equals(Object obj)
{
if (!(obj instanceof Student))
{
throw new RuntimeException("类型不匹配");
}
Student s = (Student)obj;

return this.name.equals(s.name)&&this.age==s.age;
}

public String getName()
{
return name;
}

public int getAge()
{
return age;
}
}

class MapTest
{
public static void main(String[] args)
{

/*
这里你写成HashMap了,HashMap保证元素唯一的方法,是先比较hashCode,再比较equals,
TreeMap是用compareTo 比较元素是否相同,或者自定义比较器
*/

HashMap<Student,String> map = new HashMap<Student,String>(); //将学生作为键存入,将地址作为值存入

map.put(new Student("zhangsan1",17),"beijing");
map.put(new Student("zhangsan2",14),"tianjing");
map.put(new Student("zhangsan5",14),"tianjing");
map.put(new Student("zhangsan3",11),"nanjing");
map.put(new Student("zhangsan4",16),"datong");
map.put(new Student("zhangsan4",16),"datong");


Set<Student> s = map.keySet();

Iterator<Student> it = s.iterator();

while (it.hasNext())
{
Student stu = it.next();
System.out.println(stu.getName()+"---"+stu.getAge()+"----"+map.get(stu));
}
}

}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
/*
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。



1,描述学生。
定义一个类,通过构造函数描述学生的姓名和年龄

2,定义map容器。将学生作为键,地址作为值。存入。
使用HashMap将学生作为键存入,地址作为值存入

3,获取map集合中的元素。
建立Set获取map中键,然后调用方法获取值即可

@author 张振纲
*/
import java.util.*;
class Student implements Comparable<Student>
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
                /*因为TreeMap和HashMap底层的数据结构不同,所以保持元素唯一性所依赖的方法也就不一样,TreeMap有两种排序法,这里用的是实现Comparable,覆盖compareTo方法,使元素自身具备比较性,当年龄相同在比较姓名。而HashMap依赖的才是hashCode()和equals()方法呢。*/
        public int compareTo(Student stu)
        {
                int num= new Integer (this.age) .compareTo( new Integer (stu.age));
                if(num==0)
                        return this.name.compareTo(stu.name);
                return num;
        }
        public String getName()
        {
                return name;
        }

        public int getAge()
        {
                return age;
        }
}

class TreeMapTest
{
        public static void main(String[] args)
        {              
                               //用TreeMap排序这里当然要创建TreeMap集合的对象               
                              TreeMap<Student,String> map = new TreeMap<Student,String>(); //将学生作为键存入,将地址作为值存入

                map.put(new Student("zhangsan1",17),"beijing");
                map.put(new Student("zhangsan2",14),"tianjing");
                map.put(new Student("zhangsan5",14),"tianjing");
                map.put(new Student("zhangsan3",11),"nanjing");
                map.put(new Student("zhangsan4",16),"datong");
                map.put(new Student("zhangsan4",16),"datong");


                Set<Student> s = map.keySet();

                Iterator<Student> it = s.iterator();

                while (it.hasNext())
                {
                        Student stu = it.next();
                        System.out.println(stu.getName()+"---"+stu.getAge()+"----"+map.get(stu));
                }
        }

}
回复 使用道具 举报
杜佳瑞 发表于 2012-8-8 15:31
/*
每一个学生都有对应的归属地。
学生Student,地址String。

hashmap可以排序吗?
回复 使用道具 举报
HashMap不能排序吧,可以保证元素唯一
回复 使用道具 举报
.....................................................
回复 使用道具 举报
首先HashMap不能排序,但能保证唯一~~你的程序为什么没有保证唯一呢?问题肯定处在hashCode()方法,你去看你的程序你的hashCode写错了,C大写,所以没有保证唯一~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马