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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 寇龙飞 中级黑马   /  2012-9-13 20:24  /  1824 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima.test;

  2. import java.util.HashSet;
  3. import java.util.Iterator;

  4. public class HashCodeTest {

  5.         public static void main(String[] args) {

  6.                 HashSet<OtherPerson> hashSet = new HashSet<OtherPerson>();
  7.                 hashSet.add(new OtherPerson("Avici", 25));
  8.                 hashSet.add(new OtherPerson("Jack", 38));
  9.                 hashSet.add(new OtherPerson("Rose", 32));
  10.                 hashSet.add(new OtherPerson("Lily", 17));
  11.                 hashSet.add(new OtherPerson("Lucy", 16));
  12.                
  13.                 Iterator<OtherPerson> iterator = hashSet.iterator();
  14.                 while(iterator.hasNext()) {
  15.                         println(iterator.next());
  16.                 }
  17.         }
  18.         public static void println(Object obj) {
  19.                 System.out.println(obj);
  20.         }

  21. }

  22. class OtherPerson {
  23.         private String name = null;
  24.         private int age = 0;
  25.         
  26.         public OtherPerson(String name, int age) {
  27.                 super();
  28.                 this.name = name;
  29.                 this.age = age;
  30.         }

  31.         @Override
  32.         public int hashCode() {
  33.                 final int prime = 31;
  34.                 int result = 1;
  35.                 result = prime * result + age;

  36.                 return result;
  37.         }

  38.         
  39.         @Override
  40.         public String toString() {
  41.                 return "Person [name=" + name + ", age=" + age + "]";
  42.         }
  43. }
复制代码
HashSet存储元素是将其按HashCode值放入桶中把?如何重写其方法让它将元素按照age大小顺序存进去,那么我就可以取出年龄有序的元素。

此时打印结果为:
  1. Person [name=Jack, age=38]
  2. Person [name=Lily, age=17]
  3. Person [name=Avici, age=25]
  4. Person [name=Rose, age=32]
  5. Person [name=Lucy, age=16]
复制代码
乱序啊。如何改进hashCode()方法???
  1. public int hashCode() {
  2.                 final int prime = 31;
  3.                 int result = 1;
  4.                 result = prime * result + age;

  5.                 return result;
  6.         }
复制代码

7 个回复

倒序浏览
若要用HashCode进行排序,那么别忘了还要重写 equals() 方法!!
回复 使用道具 举报
哈希表本来就是无序的,要是排序是用TreeSet集合也是set集合。
回复 使用道具 举报
HashSet存放元对象来就是无序的,复写equals方法和HashCode方法是为了保证对象的唯一性,
内容相同的对象为同一个对象
回复 使用道具 举报
朱烈葵 发表于 2012-9-13 20:35
哈希表本来就是无序的,要是排序是用TreeSet集合也是set集合。

我知道HashSet是无序的,所以想要找办法让它有序。
回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-9-13 20:58 编辑
杨卓儒 发表于 2012-9-13 20:31
若要用HashCode进行排序,那么别忘了还要重写 equals() 方法!!

我嫌equals方法太长就没贴给删了,equals在时我测试过,不行滴。它是用来判断重复与否的。跟我想要的有序有关系吗?怎么实现??
回复 使用道具 举报
杨震 中级黑马 2012-9-13 21:57:51
7#
hashset实现不了的,要用treeSet,里面传个比较器,你自己看API
回复 使用道具 举报
杨震 发表于 2012-9-13 21:57
hashset实现不了的,要用treeSet,里面传个比较器,你自己看API

treeset比较器我知道。hashset真心实现不了我想要的功能么   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马