关于HashSet的排序原理
HashSet是Set接口的一个实现,HashSet的排序原理可以从下面的实例去研究:
–1.对没有重定义hashCode,equals方法的泛型应用HashSet排序:
package com.mldn;
import java.util.Set;
import java.util.HashSet;
public class HashSetSort
{
public static void main(String[] args)
{
Set
boolean[] f = new boolean[10];
for (int x = 0; x < f.length; 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 < f.length; 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 < o.age)
{
return -1;
}
else // 年龄相等,比较姓名
{
return this.name.compareTo(o.name); // String实现了Comparable接口
}
}
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 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 java.util.Set;
import java.util.HashSet;
public class HashSetSort
{
public static void main(String[] args)
{
Set
boolean[] f = new boolean[10];
for (int x = 0; x < f.length; 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 < f.length; 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 < o.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; // 向下转型
if (this.name.equals(per.name) && this.age == per.age)
{
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的排序原理》
本文地址:http://www.xiupu.net/archives-117.html
关注公众号:
微信赞赏
支付宝赞赏