---------------------- 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