关于HashSet的排序原理

HashSet是Set接口的一个实现,HashSet的排序原理可以从下面的实例去研究:

–1.对没有重定义hashCode,equals方法的泛型应用HashSet排序:
package com.mldn;
import .util.Set;
import .util.HashSet;
public class HashSetSort
{
        public static void main(String[] args)
        {
                Set hash = new HashSet();        // 实例化hashSet实例
                boolean[] f = new boolean[10];
                for (int x = 0; x                 {
                        f[x] = false;
                }               
                // 添加不同的元素
                f[1] = hash.add(new People(“张三”, 21));        // 添加元素
                f[2] = hash.add(new People(“李三”, 23));        // 添加元素
                f[3] = hash.add(new People(“王三”, 22));        // 添加元素
                // 添加相同的元素
                f[4] = hash.add(new People(“赵三”, 20));        // 添加元素
                f[5] = hash.add(new People(“赵三”, 20));        // 添加元素        // f[5] == f[6] == false: 说明Set不保存重复的元素,添加失败!
                f[6] = hash.add(new People(“赵三”, 20));        // 添加元素
                // 添加姓名相同的元素
                f[7] = hash.add(new People(“孙三”, 28));        // 添加元素
                f[8] = hash.add(new People(“孙三”, 25));        // 添加元素
                //添加年龄相同的元素
                f[0] = hash.add(new People(“周三”, 29));        // 添加元素
                f[9] = hash.add(new People(“毛三”, 29));        // 添加元素 // f[9] == false : 说明Set不保存重复的元素,添加失败!
                // hashSet 判断元素是否重复的标准:泛型对Comparable的实现,这里People类对比较器的实现不全面:没有对name属性进行比较,所以f[9] 操作失败!应该加入所有属性的定义;
                for (int x = 0; x                 {
                        System.out.println(x + ” ” + f[x]);
                }
                System.out.println(“该集合的长度:” + hash.size());
                System.out.println(hash);        // 输出按hashSet排序的元素
        }
}
class People implements Comparable
{
        private String name = null;        // 姓名
        private int age = 0;        // 年龄
        public People(String name, int age)
        {
                this.name = name;
                this.age = age;
        }
        public int compareTo(People o)
        {
                if (this.age > o.age)       
                {
                        return 1;
                }
                else if (this.age                 {
                        return -1;
                }
                else        // 年龄相等,比较姓名
                {
                        return this.name.compareTo(o.name);        // String实现了Comparable接口
                }
        }
        public String toString()
        {
                return “姓名:” + this.name + ” 年龄:” + this.age;
        }
}
/*
administrator@xu-desktop:~$ com.mldn.HashSetSort
0 true
1 true
2 true
3 true
4 true
5 true        // 明显的重复竟然没有过滤! 说明HashSet还需要判断标准,必须在泛型中重定义hashCode(),equals(Object obj)方法!
6 true
7 true
8 true
9 true
该集合的长度:10
[姓名:赵三 年龄:20, 姓名:毛三 年龄:29, 姓名:周三 年龄:29, 姓名:孙三 年龄:25, 姓名:王三 年龄:22, 姓名:赵三 年龄:20, 姓名:李三 年龄:23, 姓名:赵三 年龄:20, 姓名:孙三 年龄:28, 姓名:张三 年龄:21]
没有去掉重复的元素,必须覆写两个方法,
*/
——2.分别在泛型中覆写hasCode(), equals(Object obj):
package com.mldn;
import .util.Set;
import .util.HashSet;
public class HashSetSort
{
        public static void main(String[] args)
        {
                Set hash = new HashSet();        // 实例化hashSet实例
                boolean[] f = new boolean[10];
                for (int x = 0; x                 {
                        f[x] = false;
                }               
                // 添加不同的元素
                f[1] = hash.add(new People(“张三”, 21));        // 添加元素
                f[2] = hash.add(new People(“李三”, 23));        // 添加元素
                f[3] = hash.add(new People(“王三”, 22));        // 添加元素
                // 添加相同的元素
                f[4] = hash.add(new People(“赵三”, 20));        // 添加元素
                f[5] = hash.add(new People(“赵三”, 20));        // 添加元素        // f[5] == f[6] == false: 说明Set不保存重复的元素,添加失败!
                f[6] = hash.add(new People(“赵三”, 20));        // 添加元素
                // 添加姓名相同的元素
                f[7] = hash.add(new People(“孙三”, 28));        // 添加元素
                f[8] = hash.add(new People(“孙三”, 25));        // 添加元素
                //添加年龄相同的元素
                f[0] = hash.add(new People(“周三”, 29));        // 添加元素
                f[9] = hash.add(new People(“毛三”, 29));        // 添加元素 // f[9] == false : 说明Set不保存重复的元素,添加失败!
                // hashSet 判断元素是否重复的标准:泛型对Comparable的实现,这里People类对比较器的实现不全面:没有对name属性进行比较,所以f[9] 操作失败!应该加入所有属性的定义;
                for (int x = 0; x                 {
                        System.out.println(x + ” ” + f[x]);
                }
                System.out.println(“该集合的长度:” + hash.size());
                System.out.println(hash);        // 输出按hashSet排序的元素
        }
}
class People implements Comparable
{
        private String name = null;        // 姓名
        private int age = 0;        // 年龄
        public People(String name, int age)
        {
                this.name = name;
                this.age = age;
        }
        public int compareTo(People o)        // 实现Comparable 接口
        {
                if (this.age > o.age)       
                {
                        return 1;
                }
                else if (this.age                 {
                        return -1;
                }
                else        // 年龄相等,比较姓名
                {
                        return this.name.compareTo(o.name);        // String实现了Comparable接口
                }
        }
        public int hashCode()        // 覆写hashCode()
        {
                return this.name.hashCode() * this.age;        // 自定义哈希码,String实现了哈希
        }
        public boolean equals(Object obj)        // 覆写equals(…)
        {
                if (this == obj)        // 内存地址相同,肯定相等
                {
                        return true;
                }
                if (obj instanceof People)        // 若是People的实例,才有比较意义
                {
                        People per = (People)obj;                // 向下转型

                        {
                                return true;
                        }
                        else
                        {
                                return false;
                        }
                }
                else
                {
                        return false;
                }
        }
        public String toString()
        {
                return “姓名:” + this.name + ” 年龄:” + this.age;
        }
}
/*
administrator@xu-desktop:~$ java com.mldn.HashSetSort
0 true
1 true
2 true
3 true
4 true
5 false        // 终于识别并排除了重复元素
6 false
7 true
8 true
9 true        // 识别了非重复元素
该集合的长度:8        // 根据散列表排序结果:
[姓名:李三 年龄:23, 姓名:毛三 年龄:29, 姓名:孙三 年龄:28, 姓名:王三 年龄:22, 姓名:赵三 年龄:20, 姓名:孙三 年龄:25, 姓名:张三 年龄:21, 姓名:周三 年龄:29]
*/

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《关于HashSet的排序原理
本文地址:https://www.zhiletu.com/archives-117.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微