黑马程序员技术交流社区

标题: 如何利用HashCode特性实现排序??? [打印本页]

作者: 寇龙飞    时间: 2012-9-13 20:24
标题: 如何利用HashCode特性实现排序???
  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.         }
复制代码

作者: 杨卓儒    时间: 2012-9-13 20:31
若要用HashCode进行排序,那么别忘了还要重写 equals() 方法!!
作者: 朱烈葵    时间: 2012-9-13 20:35
哈希表本来就是无序的,要是排序是用TreeSet集合也是set集合。
作者: 王金科    时间: 2012-9-13 20:48
HashSet存放元对象来就是无序的,复写equals方法和HashCode方法是为了保证对象的唯一性,
内容相同的对象为同一个对象
作者: 寇龙飞    时间: 2012-9-13 20:53
朱烈葵 发表于 2012-9-13 20:35
哈希表本来就是无序的,要是排序是用TreeSet集合也是set集合。

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

我嫌equals方法太长就没贴给删了,equals在时我测试过,不行滴。它是用来判断重复与否的。跟我想要的有序有关系吗?怎么实现??
作者: 杨震    时间: 2012-9-13 21:57
hashset实现不了的,要用treeSet,里面传个比较器,你自己看API
作者: 寇龙飞    时间: 2012-9-13 23:07
杨震 发表于 2012-9-13 21:57
hashset实现不了的,要用treeSet,里面传个比较器,你自己看API

treeset比较器我知道。hashset真心实现不了我想要的功能么   




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