您的位置:首页 > 职场人生

黑马程序员------集合框架(No.3)(Set、TreeSet、HashSet)

2013-09-16 19:35 344 查看
----------------------
ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------



Set


|----Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
|----HashSet:底层数据结是哈希表。线程是非同步的。
|----TreeSet:底层数据结构是二叉树。可以对Set集合中的元素进行排序。按照自然顺序。保证元素唯一性的依据:compareTo方法return
0;
Set集合的功能和Collection是一致的。

import java.util.*;
class HashSetDemo{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args)	{
HashSet hs = new HashSet();
sop(hs.add("java01"));//输出true
sop(hs.add("java01"));//输出false
hs.add("java02");
hs.add("java03");
hs.add("java03");
hs.add("java04");

Iterator it = hs.iterator();
while(it.hasNext()){
sop(it.next());
}
}
}




HashSet


HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成的。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashCode的值不同,不会调用equals。

注意:对于元素是否存在,以及删除等操作,依赖的方法是元素的HashCode和equals方法

import java.util.*;
/*
是通过元素的两个方法,hashCode和equals来完成的。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashCode的值不同,不会调用equals。
*/
class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String toString(){
return "("+name+":"+age+")";
}
//使用HashSet要重写hashCode,equals方法。
public int hashCode(){
return name.hashCode()+age*40;
}
public boolean equals(Object obj){
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
}
class HashSetDemo2{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args)	{
HashSet hs = new HashSet();
hs.add(new Person("zhangsan",10));
hs.add(new Person("lisi",14));
hs.add(new Person("zhangsan",10));
hs.add(new Person("zhaoliu",12));
hs.add(new Person("lisi",14));
hs.add(new Person("lisi",14));

Iterator it = hs.iterator();
while(it.hasNext()){
sop(it.next());
}
}
}




TreeSet


TreeSet:底层数据结构是二叉树。可以对Set集合中的元素进行排序。按照自然顺序。保证元素唯一性的依据:compareTo方法return 0;

TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,重写compareTo方法。这种方式也称为元素的自然顺序,也叫默认顺序。

TreeSet排序的第二种方式:当元素不具备比较性,或者具备的比较性不是所需要的。这时需要让集合自身具有比较性。在集合初始化时就有了比较方式。定义一个类,实现Comparator接口。覆盖compare方法。

当两种排序都存在时,以比较器为主。

可以对Set集合中的元素进行排序。按照自然顺序。
import java.util.*;
class TreeSetDemo{
public static void main(String[] args){
TreeSet ts = new TreeSet();
ts.add("csa");
ts.add("dsadas");
ts.add("adad");
ts.add("thhsad");
ts.add("dsda");
ts.add("cad");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

输出结果:



练习:比较方式1
import java.util.*;
/*
需求:
往TreeSet中存储自定义对象人
想按照人的年龄排序。

记住:排序时,当主要条件相同时,一定要判断一下次要条件。
*/
class Person implements Comparable{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String toString(){
return "("+name+":"+age+")";
}
public int compareTo(Object obj){
if(!(obj instanceof Person))
throw new RuntimeException("这个对象不符合要求...");
Person p = (Person)obj;
if(this.age>p.age)
return 1;
if(this.age==p.age)
{
return this.name.compareTo(p.name);
}
return -1;
}
}
class TreeSetDemo{
public static void main(String[] args){
TreeSet ts = new TreeSet();
ts.add(new Person("lisi01",11));
ts.add(new Person("lisi01",16));
ts.add(new Person("lisi01",12));
ts.add(new Person("lisi01",13));
ts.add(new Person("lisi02",11));
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

输出结果



练习:比较方式2

import java.util.*;
/*
需求:
往TreeSet中存储自定义对象人
想按照人的年龄排序。

在集合初始化时就有了比较方式。定义一个类,实现Comparator接口。覆盖compare方法。

当两种排序都存在时,以比较器为主。
*/
class Person implements Comparable{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String toString(){
return "("+name+":"+age+")";
}
public int compareTo(Object obj){
if(!(obj instanceof Person))
throw new RuntimeException("这个对象不符合要求...");
Person p = (Person)obj;
if(this.age>p.age)
return 1;
if(this.age==p.age)
{
return this.name.compareTo(p.name);
}
return -1;
}
}
class TreeSetDemo{
public static void main(String[] args){
TreeSet ts = new TreeSet(new MyCompare());//构造函数初始化实现Comparator的子类。
ts.add(new Person("lisi01",11));
ts.add(new Person("lisi02",16));
ts.add(new Person("lisi03",12));
ts.add(new Person("lisi01",13));
ts.add(new Person("lisi02",11));
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

class MyCompare implements Comparator{
public int compare(Object o1,Object o2){
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int num = p1.getName().compareTo(p2.getName());
if(num==0){
return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
}
return num;
}
}




练习:根据字符串的长度,输出TreeSet中的字符串:
class TreeSetDemo2{
public static void main(String[] args){
TreeSet ts = new TreeSet(new MyCompare());//构造函数初始化实现Comparator的子类。
ts.add("sdasdasda");
ts.add("sdasdadsadsda");
ts.add("sdasdasasdasdasdasda");
ts.add("ssasda");
ts.add("ssasda");
ts.add("aaaaaa");
ts.add("sdasdaasda");
ts.add("sdasdasadassda");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

class MyCompare implements Comparator{
public int compare(Object o1,Object o2){
String str1 = (String)o1;
String str2 = (String)o2;
int num = new Integer(str1.length()).compareTo(new Integer(str2.length()));
if(num==0){
return str1.compareTo(str2);
}
return num;
}
}




----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: