java判断字符串st6_是否包含st5_java系統學習(十四) --------常用數據結構

鏈表

什么是java中的鏈表

如果把數組作為一種數據結構,可能更容易理解。數組這種結構有一個很大的缺點,數組中的所有元素都按序排列,如果要刪除其中一個元素,后面的所有元素都需要依次

向前移動一個位置。如果這個數組中的元素很多,那么依次移動的次數就會明顯增多,從而耗費大量的系統資源。

為了解決這個問題,引入了鏈表。

在Java語言中,鏈表中的元素存儲在一條鏈的節點上,而不是像數組那樣按序存儲在一系列連續的空間中。

0a16352487d4eed2235e7b040699fea4.png

從圖可以看出,如果在數組中刪除一個元素,那么后面所有的元素都必須向前移動一位。如果元素比較多,那么移動的次數就會增加。從圖中鏈表圖中可以看出,刪除一個元素時,只需將被刪除元素的前一個元素的指針,指向被刪除元素的后一個元素,使得被刪除的元素脫離鏈表

就相當干刪除了元素。鏈表不需要像數組那樣移動元素,這樣就節約了系統資源。

雙向鏈表的結構如圖

5632cc69ca8f3cdee1ef5e82e60e2eb2.png

雙鏈表每個元素都擁有兩個指針屬性,一個是previous指針,一個是next指針。每個元素的next指針都會指向下一個元素本身,而下一個個元素的previous指針都會指向上一個元素本身。這樣,

要刪除元素就比較簡單了,只需要讓被刪元素前面元素的previous指針.指向被刪元素后面的元素本身,再將被刪除元素后面元素的next指針,指向被刪除元素的前面元素本身即可。

對鏈表的添加實例

當向鏈表添加元素素時,需要分析多種情況。

口插入到空表:如果鏈表是一個空表,只需使head指向被插入的節點即可。

口插入到頭指針后面:若鏈表中的節點沒有順序,可將新節點插入到head之后,再讓插入節點的next指針指向原head指針指向的節點即可。

口插入到鏈表最后:若鏈表中的節點沒有順序,也可將新節點插人到鏈表的最后。需將最后一個節點的next指針指向新節點,再將新節點的next指針設置為null即可。

口插入到鏈表的中間:這是比較復雜的一種情況.對干有序的鏈表,會用到這種情況。需要遍歷鏈表,井對每個節點的關鍵字進行比較,找到合適的位置,再將新節點插人

對鏈表的刪除實例。這種方式,需要修改插入位置前節點的next指針,使其指向新插入的節點,然后再將新插入節點的next指針設置為指向下一個節點。

Public class filel{

public void add(){

LinkedList List=new LinkedList();//創建一個鏈表類對象List

//添加元素到對象List里

List .add("王鵬");

List.add("王浩");

Lis七.add("王傑");

Lis七.add("張傑");

List.add("李傑");

List.add("孫文傑");

List.add("趙傑");

Iterator it=List.iterator();//創建一個迭代器對象it

system.out.println("現在添加了如下的同學的姓名");

//通過:迭代器對象it來遍歷List對象中的元素

while(it.hasNext()){

System.out.Println(it.next());

}

system.out.println("刪除某些同學的姓名后,還剩下哪些同學呢?");

it.remove();//移除元素

//創建另一個迭代器對象itl來重新遍歷list對象中的元素

Iterator itl=List.iterator();

for(inti=0;i

System.out.Println(itl.next());

}

}

public static void main(string[} args){//主方法

filel f=new filel();//創建對象f

f.add();//調用方法add()

}

}

結果:

王鵬

王浩

王傑

張傑

李傑

孫文傑

趙傑

刪除某些同學的姓名后還剩下哪些同學呢。

王鵬

王浩

王傑

張傑

李傑

孫文傑

因為第一個迭代器在遍歷后,已經到了鏈表的末尾.所以必須再建立一個新的迭代器,重新讓指針停留在鏈表第一個元素的前面。

對鏈表刪除的實例

class student{ //創建一個學生類

//創建成員變量

String name;

int age;

String sexy;

String code;

String school;

String grade;

string major;

String address;

//創建兩個student類型屬性

studentx;

studenty;

student(String name){

this.name=name;

}

//帶參構造函數

Public void set(int age,String sexy,string code,String scbool,

string grade,string major,string address){

this .age=age;

this .sexy=sexy;

this .school=school;

this .grade=grade;

this.major=major;

this.code=code;

this.address=address;

}

//創建各種屬性的訪問器

Public strinq getname(){

retUrn name;

}

Public string getcode(){

return name;

}

Public String getsexy(){

return sexy;

}

Public int getage(){

return age;

}

Public String getschool(){

return school;

}

public string getmajor(){

return major;

}

public Strinq getgrade(){

return grade;

}

Public String getaddress(){

return address'

}

//重寫toString()方法是讓對象以字符串的形式輸出的方法

Public String toString(){

string information="學生姓名:"+name+" "+"學號:"+code+" "+"性別:"

+sexy+" "+"年齡:"+age+" "+"所在學校:"+school+" "

+"所學專業:"+major+" "+"所在年級:"+grade+" "+"家庭地址:"

+address;

return information;

}

}

Public class file2{ //創建測試類file2

Publie static void main(string[] args){ //主方法

//創建10個學生對象

student stl=new student("王鵬");

student st2=new student("王浩");

student st3=new student("孫鵬");

student st4=new student("孫文君");

student st5=new student("譚妮");

student st6=new student("趙志強");

student st7=new student("王凱");

student st8=new student("蘇瑞");

student st9=new student("張偉");

student st10=new student("張傑");

//設置學生信息

st1.set(20,"男","10000","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st2.set(22,"男","10001","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st3.set(21,"男","10002","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st4.set(19,"女","10003","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st5.set(18,"女","10004","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st6.set(24,"男","10005","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st7.set(22,"男","10006","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st8.set(29,"女","10007","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st9.set(25,"女","10008","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

st10.set(28,"男","10009","重慶大學","大學三年級","計算機專業","重慶市沙坪壩區");

try{

LinkedList listl=new LinkedList(); //創建對象listl

//添加10個學生對象到對象listl中

listl.add(stl);

listl.add(st2);

listl.add(st3);

listl.add(st4);

listl.add(st5);

listl.add(st6);

listl.add(st7);

listl.add(st8);

listl.add(st9);

listl.add(st10);

//it是迭代器對象通過它來指向鏈表中的元素

Iterator it=listl.iterator();

System.out.println("以下就是所有的同學的信息:");

while(it.hasNext()){//通過循環輸出相應信息

system.out.println(it.next());

}

System.out.println("其中有幾個同學已經轉學了!");

System.out.print1n("那么就從數據庫中刪除他:");

//移除相應信息

listl.relnove();

listl.remove();

listl.remove();

listl.reynove();

listl.remove();

Iterator it1=List1.iterator();//獲取迭代器對象itl

while(itl.hasNext()){

System.out.Println(itl.next());

}

}catch(Exception e){

}

}

}

數組列表類

什么是數組列表類

數組的容量一旦被初始化就不可以再更改。這對於正在運行的程序來說,是一種缺陷。在程序設計過程中,經常會遇到一些不確定的因素,導致無法確定一個數組的容量。為了解決這個問題,java引進了數組列表。

數組列表類就是數組的一個擴展類,它繼承了數組的特點,並且具有自己的特性。

數組列表就是一個可以動態變化容量的數組,其根據正在運行的程序的變化,隨時改變數組的容量,以滿足程序的需要。

ArrayList類是Java API所提供的類,定義在Java.util包里,所以每次編寫程序的時候都必

須引入這個包。數組列表中存放的是Object類型,因此在數組列表中存放的對象類型,以其原型的父類代替。如果要提取其中的元素,都要進行類型轉換,將元素還原為它本身的類型。

由於ArrayList是個可以自動伸縮的數組,所以可以無限制地向數組中添加新元素。另外,因為添加的是object類的子類類型,所以系統會自動地完成子類向父類的轉換。

如果能預計一個數組列表中需要存儲多少元素,那么可以在填充之前,調用"ensureCapacity()"方法,使得系統分配一個包含固定容量的內部數組。

實例熟悉數組列表

數組列表(ArrayList)的構造函數和常用方法如下。

口ArrayList():這是一個默認構造函數,系統默認的初始化容量是10。

口ArrayList(Collection):構建一個數組列表的對象,這個數組列表中包含集合的所有元素。

口ArrayList(int initcapcity):構建一個指定初始化容量的數組列表對象。

口void add(int index,object element):在指定位置插入指定的元素。

口boolean add(object):在數組列表的末尾追加一個新元素。

口boolean contains(object element):測試指定的數組列表中是否包含有指定的元素element,如果包含該元素則返回true,反之返回false。

口int size():返回數組列表中包含元素的數量。

口void set(int index,object obj):設置數組列表指定位置元素的值,它會覆蓋原來的內容。要強調的就是index必須在0到size()-1之間。

口object get(int index):得到指定位置存儲的元素值。

口object remove(int index):刪除指定位置的元素。

class teacher{//創建教師對象類

//創建成員變量

private string schoolname;//關於教師所在學校名稱屬性

private string classname;//關於教師所教班級名稱屬性

private string teachername;//關於教師姓名屬性

private string teachercode://關於教師工號屬性

private string teachersexy;//關於教師性別屬性

private string teacherbirthday;//關於教師出生年月屬性

private string familyaddress://關於教師家庭地址屬性

//帶參構造函數

public teacher(String teachernamee,String teachercode,String teachersexy,

string teacherbirthday)(

this.teachername=teachername;

this.teachercode=teachercode;

this.teachersexy=teachersexy;

this.teacherbirthday=teacherbirthday;

}

//關於各個屬性的訪問器

public String getname(){

return teachername;

}

public String getcode(){

return teachercode;

}

public String getsexy(){

return teachersexy;

}

public String getbirthday(){

return teacherbirthday;

}

public void setschoolname(String schoolname){

this.schoolname=schoolname;

}

public void setclassname(String classname){

this.classname=classname;

}

public void setfamilyaddress(String familyaddress){

this.familyaddress=familyaddress;

}

public String getschoalname(){

return schoolname

}

public String getclassname(){

return classname;

}

public String getfamilyaddress(){

return familyaddress;

}

//重寫toString()方法以使得對象能夠以字符串形式輸出的方法

public String toString(){

String infor="學校名稱:"+schoolname+" "+"班級名稱:"+classname+" "+"教師姓名:"+steachername+" "+"教師工號:"+teachercode+" "+"性別:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress;

return infor;

}

}

public class testl{

public static void main(String[] args){

ArrayList al=new ArrayList();

//創建7個教師對象

teacher t=new teacher("孟凡良","34512","男","1954-09-23");

teacher tl=new teacher("趙浩","1234001","男","1981-01-02");

teacher t2=new teacher("黎平","1234002","男","1982-08-09");

teacher t3=new teacher("王鵬","1234003","男","1982-11-22");

teacher t4=new teacher("宋波","1234004","女","1982-11-02");

teacher t5=new teacher("童偉","1234005","男","1980-01-12");

teacher t6=new teacher("孫君","1234006","女","1981-09-22");

//設置教師對象信息

tl.setschoolname("重慶大學");

tl.setclassname("計算機三班"’),

tl.setfamilyaddress("重慶沙坪壩");

t2.setschoolname("重慶大學"”);

t2.setclassname("計算機三班");

t2.setfamilyaddress("重慶沙坪壩");

t3.setschoolname("重慶大學");

t3.setclassname("計算機三班");

t3.setfamilyaddress("重慶沙坪壩");

t4.setschoolname("重慶大學");

t4.setclassname("計算機三班");

t4.setfamilyaddress("重慶沙坪壩");

t5.setschoolname("重慶大學");

t5.setclassname("計算機三班");

t5.setfamilyaddress("重慶沙坪壩");

t6.setschoolname("重慶大學");

t6.setclassnarne("計算機三班");

t6.setfamilyaddress("重慶沙坪壩");

t.setschoolname("成都科技大學");

t.setc1assname("機械系三班");

t.setfamilyaddress("成都市區");

//把每個對象添加到數組列表中去

al.add(tl);

al.add(t2);

al.add(t3);

al.add(t4);

al.add(ts);

al.add(t6);

System.out.println("這個小組有"+al.size()+"個教師。");

//輸出數組列表中的元素個數

for(int i=O;i

//輸出數組列表中的元素以字符串形式

system.out.println((teacher)al.get(i));

}

System.out.println("對不起.系統出錯了!有個教師信息錯了,需要改正。");

al.set(5,t);

System.out.println("經過我們的審核后,教師信息如下:");

for(int i=0;i

System.out.Println((teacher)al.get(i));

}

//刪除數組列表中的元素

al.remove(2);

al.remove(4);

System.out.println(”有兩個教師辭職了,所以剩下教師信息為:");

for(int i=O;i

//輸出剩下的數組別表中的元素

System.out.Println((teacher)al.get(i));

}

}

}

散列表

什么是散列表

在鏈表和數組列表中,要想查找某個特定的元素,就必須從頭開始遍歷。如果一個鏈表或者一個數組列表擁有的元素數量很大,那么就需要耗費大量的系統資源,去遍歷整個數據結構。如何克服這個弊病?此時,就引進了另一個數據結構:散列表。

散列表通過“鍵一值對應”的形式存儲元素。與鏈表和數組列表不同,它是一個無序的數據結構。

實例熟悉散列表

散列表(Hash table)的構造函數如下:

口Hashtable():構建一個空的散列表,初始容量為1l,負載因子為0.75。

口Hashtable(int initalCapacity,float loadFactor):指定初始化容量和負載因子,構造一個散列表。

口Hashtable(Map t):根據映像所包含的元素,構建一個散列表。

散列表(Hash table)的主要方法如下。

口object put( object key,object vaule):put方法是向一個散列表中添加元素。在散列表中根據所添加元素的鍵值來定位元素,這個鍵值是唯一的。針對這個方法,要記住這個鍵

值一定是對象型數據。

口boolean containskey(object key)和boolean containvalue(object valt:e):這兩個方法是測試散列表中是否包含指定的鍵值和值。

口Object remove(object key):根據指定的鍵值從散列表中刪除對應鍵的元素。

口collection values():返回散列表中所包含元素的集合,是元素的集合,而不是key的集合。

class teacher{//創建教師對象類

//創建成員變量

private string schoolname;//關於教師所在學校名稱屬性

private string classname;//關於教師所教班級名稱屬性

private string teachername;//關於教師姓名屬性

private string teachercode://關於教師工號屬性

private string teachersexy;//關於教師性別屬性

private string teacherbirthday;//關於教師出生年月屬性

private string familyaddress://關於教師家庭地址屬性

//帶參構造函數

public teacher(String teachernamee,String teachercode,String teachersexy,

string teacherbirthday)(

this.teachername=teachername;

this.teachercode=teachercode;

this.teachersexy=teachersexy;

this.teacherbirthday=teacherbirthday;

}

//關於各個屬性的訪問器

public String getname(){

return teachername;

}

public String getcode(){

return teachercode;

}

public String getsexy(){

return teachersexy;

}

public String getbirthday(){

return teacherbirthday;

}

public void setschoolname(String schoolname){

this.schoolname=schoolname;

}

public void setclassname(String classname){

this.classname=classname;

}

public void setfamilyaddress(String familyaddress){

this.familyaddress=familyaddress;

}

public String getschoalname(){

return schoolname

}

public String getclassname(){

return classname;

}

public String getfamilyaddress(){

return familyaddress;

}

//重寫toString()方法以使得對象能夠以字符串形式輸出的方法

public String toString(){

String infor="學校名稱:"+schoolname+" "+"班級名稱:"+classname+" "+"教師姓名:"+steachername+" "+"教師工號:"+teachercode+" "+"性別:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress;

return infor;

}

}

public class test2{

public static void main(String[] args){

Hashtable ht=new Hashtable();

//創建7個教師對象

teacher t=new teacher("孟凡良","34512","男","1954-09-23");

teacher tl=new teacher("趙浩","1234001","男","1981-01-02");

teacher t2=new teacher("黎平","1234002","男","1982-08-09");

teacher t3=new teacher("王鵬","1234003","男","1982-11-22");

teacher t4=new teacher("宋波","1234004","女","1982-11-02");

teacher t5=new teacher("童偉","1234005","男","1980-01-12");

teacher t6=new teacher("孫君","1234006","女","1981-09-22");

tl.setschoolname("重慶大學");

tl.setclassname("計算機三班"’),

tl.setfamilyaddress("重慶沙坪壩");

t2.setschoolname("重慶大學"”);

t2.setclassname("計算機三班");

t2.setfamilyaddress("重慶沙坪壩");

t3.setschoolname("重慶大學");

t3.setclassname("計算機三班");

t3.setfamilyaddress("重慶沙坪壩");

t4.setschoolname("重慶大學");

t4.setclassname("計算機三班");

t4.setfamilyaddress("重慶沙坪壩");

t5.setschoolname("重慶大學");

t5.setclassname("計算機三班");

t5.setfamilyaddress("重慶沙坪壩");

t6.setschoolname("重慶大學");

t6.setclassnarne("計算機三班");

t6.setfamilyaddress("重慶沙坪壩");

t.setschoolname("成都科技大學");

t.setc1assname("機械系三班");

t.setfamilyaddress("成都市區");

//在散列表中添加元素

ht.put("zh",t1);

ht.put("lp",t2);

ht.put("wp",t3);

ht.put("sb",t4);

ht.put("zw",t5);

ht.put("sj",t6);

System.out.println("這個小組有"+ht.size()+"個教師。");

System.out.println(ht.values());

System.out.println("我需要查找一個教師的信息。");

//輸出散列表中的元素內容

if (ht.containsKey("wh")){

System.out.println("找到了此教師的信息.如下:");

System.out.println((teacher)ht.get("ww"));

}else{

System.out.println("沒有找到此教師的信息!");

}

ht.remove("lp");//刪除散列表中的元素

ht .remove("sj");

System.out.println("由於有些教師離開了學校,經過我們的審核后教師信息如下:");

System.out,println(ht.values());//輸出散列表中剩下的元素內容

}

}

散列集

什么是散列集

散列表和散列集這兩種數據結構,功能基本相同,不過它們實現的接口不一樣。散列表實現的是Map(映像)接口,而散列集實現了Set接口。另外,散列表是線性同步,而散列集是非線性同步。

散列集( HashSet )既然實現了Set接口 ,也就實現了Collection接口,所以它是一個集合。仍然是add方法添加元素,接下來介紹散列集的構造函數和常用方法函數。

散列集( HashSet)的構造函數如下:

口HashSet():創建一個空的散列集對象。

口HashSet(collection c):創建一個包含有collection集合中所有元素的散列集對象。

口HashSet(int initialCapacity):創建一個初始容量為initialCapacity的散列集對象。

口HashSet(int initialCapacity,float loadFactor):指定初始化容量和負載因子,構造一個散列表。它的初始容量是16,負載因子為0.75

散列集(HashSet)的常用方法如下:

口Boolean add(o):添加一個元素到散列集中。如果這個元素在散列集不存在,就直接添加它,否則就返回false

口Boolean remove(o):刪除一個元素,如果這個元素存在,就刪除它,否則就返回false

口Boolean isempty():判斷集合是否為空。

當然散列集的方法不止這些,此處只是列出其中常用的。在后面的程序中,還會遇到一些到時候再介紹。

實例熟悉散列集

class teacher{//創建教師對象類

//創建成員變量

private string schoolname;//關於教師所在學校名稱屬性

private string classname;//關於教師所教班級名稱屬性

private string teachername;//關於教師姓名屬性

private string teachercode://關於教師工號屬性

private string teachersexy;//關於教師性別屬性

private string teacherbirthday;//關於教師出生年月屬性

private string familyaddress://關於教師家庭地址屬性

//帶參構造函數

public teacher(String teachernamee,String teachercode,String teachersexy,

string teacherbirthday)(

this.teachername=teachername;

this.teachercode=teachercode;

this.teachersexy=teachersexy;

this.teacherbirthday=teacherbirthday;

}

//關於各個屬性的訪問器

public String getname(){

return teachername;

}

public String getcode(){

return teachercode;

}

public String getsexy(){

return teachersexy;

}

public String getbirthday(){

return teacherbirthday;

}

public void setschoolname(String schoolname){

this.schoolname=schoolname;

}

public void setclassname(String classname){

this.classname=classname;

}

public void setfamilyaddress(String familyaddress){

this.familyaddress=familyaddress;

}

public String getschoalname(){

return schoolname

}

public String getclassname(){

return classname;

}

public String getfamilyaddress(){

return familyaddress;

}

//重寫toString()方法以使得對象能夠以字符串形式輸出的方法

public String toString(){

String infor="學校名稱:"+schoolname+" "+"班級名稱:"+classname+" "+"教師姓名:"+steachername+" "+"教師工號:"+teachercode+" "+"性別:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress;

return infor;

}

}

public class test3{

public static void main(String[] args){

HashSet hs=new HashSet();

//創建7個教師對象

teacher t=new teacher("孟凡良","34512","男","1954-09-23");

teacher tl=new teacher("趙浩","1234001","男","1981-01-02");

teacher t2=new teacher("黎平","1234002","男","1982-08-09");

teacher t3=new teacher("王鵬","1234003","男","1982-11-22");

teacher t4=new teacher("宋波","1234004","女","1982-11-02");

teacher t5=new teacher("童偉","1234005","男","1980-01-12");

teacher t6=new teacher("孫君","1234006","女","1981-09-22");

tl.setschoolname("重慶大學");

tl.setclassname("計算機三班"’),

tl.setfamilyaddress("重慶沙坪壩");

t2.setschoolname("重慶大學"”);

t2.setclassname("計算機三班");

t2.setfamilyaddress("重慶沙坪壩");

t3.setschoolname("重慶大學");

t3.setclassname("計算機三班");

t3.setfamilyaddress("重慶沙坪壩");

t4.setschoolname("重慶大學");

t4.setclassname("計算機三班");

t4.setfamilyaddress("重慶沙坪壩");

t5.setschoolname("重慶大學");

t5.setclassname("計算機三班");

t5.setfamilyaddress("重慶沙坪壩");

t6.setschoolname("重慶大學");

t6.setclassnarne("計算機三班");

t6.setfamilyaddress("重慶沙坪壩");

t.setschoolname("成都科技大學");

t.setc1assname("機械系三班");

t.setfamilyaddress("成都市區");

hs.add(t1);

hs.add(t2);

hs.add(t3);

hs.add(t4);

hs.add(t5);

hs.add(t6);

System.out.println("這個小組有"+hs.size()+"個教師。");

//輸出散列集的元素個數

Iterator it=hs.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

hs.remove(t3);

hs.remove(t4);

System.out.println("由於有些教師離開了學校,經過我們的審核后,教師信息如下:");

Iterator it1=hs.iterator();//新建一個迭代器對象

while(it1.hasNext()){

System.out.println(itl.next());

}

System.out.println("這些教師今天都離職了,所有教師信息都可以刪除了!");

hs.remove(tl);//刪除散列集中的元素

hs.remove(t2);

hs.remove(t5);

hs.remove(t6);

if (hs.isEmpty()){//當hs中的元素為空時

System.out.println("這里把教師信息都刪除了");

}else{

System.out.println("系統報錯了!!!");

}

}

樹集

什么是樹集

樹集有點像散列集,但與散列集不同,樹集是一種有序的數據結構。可以使用各種次序往樹集中添加元素。當遍歷時,元素出現次序是有序的。不過這種次序由系統自動完成。

那么系統是如何對其進行自動排序的呢?系統每添加一個元素時,將按照字典順序比較相應的字符串,按相應順序來完成排序。

樹集的構造函數和常用的方法函數。樹集(TreeSet )的構造函數如下:

口TreeSet():創建一個空的樹集對象。

口TreeSet(collection c):創建一個樹集對象,並且用指定的比較器給它的元素排序。

口TreeSet(sortedSet element);創建一個樹集,並把有序集element的所有元素插入樹中,它使用與有序集element相同的元素比較器。

樹集(TreeSet)的常用方法函數如下:

口Boolean add(object o):添加一個對象元素到樹集中去。

口Boolean remove(object o):從樹集中刪除一個對象元素。

實例熟悉樹集

class teacher implements Comparable{//設計實現Comparable接口的teacher

//創建成員變量

private string schoolname;//關於教師所在學校名稱屬性

private string classname;//關於教師所教班級名稱屬性

private string teachername;//關於教師姓名屬性

private string teachercode://關於教師工號屬性

private string teachersexy;//關於教師性別屬性

private string teacherbirthday;//關於教師出生年月屬性

private string familyaddress://關於教師家庭地址屬性

//帶參構造函數

public teacher(String teachernamee,String teachercode,String teachersexy,

string teacherbirthday)(

this.teachername=teachername;

this.teachercode=teachercode;

this.teachersexy=teachersexy;

this.teacherbirthday=teacherbirthday;

}

public int compareTo(Object o){ //實現方法compareTo

teacher t=(teacher) o;//轉換成teacher對象

return(t.teachercode - teachercode);

}

//關於各個屬性的訪問器

public String getname(){

return teachername;

}

public String getcode(){

return teachercode;

}

public String getsexy(){

return teachersexy;

}

public String getbirthday(){

return teacherbirthday;

}

public void setschoolname(String schoolname){

this.schoolname=schoolname;

}

public void setclassname(String classname){

this.classname=classname;

}

public void setfamilyaddress(String familyaddress){

this.familyaddress=familyaddress;

}

public String getschoalname(){

return schoolname

}

public String getclassname(){

return classname;

}

public String getfamilyaddress(){

return familyaddress;

}

//重寫toString()方法以使得對象能夠以字符串形式輸出的方法

public String toString(){

String infor="學校名稱:"+schoolname+" "+"班級名稱:"+classname+" "+"教師姓名:"+steachername+" "+"教師工號:"+teachercode+" "+"性別:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress;

return infor;

}

}

public class test6{

public static void main(String[] args){

ThreeSet ts=new ThreeSet();

//創建7個教師對象

teacher t=new teacher("孟凡良","34512","男","1954-09-23");

teacher tl=new teacher("趙浩","1234001","男","1981-01-02");

teacher t2=new teacher("黎平","1234002","男","1982-08-09");

teacher t3=new teacher("王鵬","1234003","男","1982-11-22");

teacher t4=new teacher("宋波","1234004","女","1982-11-02");

teacher t5=new teacher("童偉","1234005","男","1980-01-12");

teacher t6=new teacher("孫君","1234006","女","1981-09-22");

tl.setschoolname("重慶大學");

tl.setclassname("計算機三班"’),

tl.setfamilyaddress("重慶沙坪壩");

t2.setschoolname("重慶大學"”);

t2.setclassname("計算機三班");

t2.setfamilyaddress("重慶沙坪壩");

t3.setschoolname("重慶大學");

t3.setclassname("計算機三班");

t3.setfamilyaddress("重慶沙坪壩");

t4.setschoolname("重慶大學");

t4.setclassname("計算機三班");

t4.setfamilyaddress("重慶沙坪壩");

t5.setschoolname("重慶大學");

t5.setclassname("計算機三班");

t5.setfamilyaddress("重慶沙坪壩");

t6.setschoolname("重慶大學");

t6.setclassnarne("計算機三班");

t6.setfamilyaddress("重慶沙坪壩");

t.setschoolname("成都科技大學");

t.setc1assname("機械系三班");

t.setfamilyaddress("成都市區");

ts.add(t1);

ts.add(t2);

ts.add(t3);

ts.add(t4);

ts.add(t5);

ts.add(t6);

System.out.println("這個小組有"+ts.size()+"個教師。");

//輸出樹集的元素個數

Iterator it=ts.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

hs.remove(t3);

hs.remove(t4);

System.out.println("由於有些教師離開了學校,經過我們的審核后,教師信息如下:");

Iterator it1=ts.iterator();//新建一個迭代器對象

while(it1.hasNext()){

System.out.println(itl.next());

}

System.out.println("這些教師今天都離職了,所有教師信息都可以刪除了!");

ts.remove(tl);//刪除散列集中的元素

ts.remove(t2);

ts.remove(t5);

ts.remove(t6);

if (ts.isEmpty()){//當hs中的元素為空時

System.out.println("這里把教師信息都刪除了");

}else{

System.out.println("系統報錯了!!!");

}

}

映像

什么是映像

集合是一種可以快速查找已存在元素的數據結構。但如果數據庫中擁有大量的數據,一般不用集合,因為它會耗費系統大量的資源和時間,去遍歷整個數據結構。

前面講過散列表,其實散列表就是一種映像。下面通過一個實例讓讀者對映像的概念有更深的認識。

映像是一種采用“鍵值一值”的對應方式存儲數據的數據結構形式。在映像中,除了散列表,還有樹映像和散列映像。由於映像不能使用迭代器,所以映像擁有get方法函數。無論是樹映像,還是散列映像或散列表,它們的使用方法都差不多。

實例熟悉映像

下面通過實例了解樹映像。

class teacher{

//創建成員變量

private string schoolname;//關於教師所在學校名稱屬性

private string classname;//關於教師所教班級名稱屬性

private string teachername;//關於教師姓名屬性

private string teachercode://關於教師工號屬性

private string teachersexy;//關於教師性別屬性

private string teacherbirthday;//關於教師出生年月屬性

private string familyaddress://關於教師家庭地址屬性

//帶參構造函數

public teacher(String teachernamee,String teachercode,String teachersexy,

string teacherbirthday)(

this.teachername=teachername;

this.teachercode=teachercode;

this.teachersexy=teachersexy;

this.teacherbirthday=teacherbirthday;

}

//關於各個屬性的訪問器

public String getname(){

return teachername;

}

public String getcode(){

return teachercode;

}

public String getsexy(){

return teachersexy;

}

public String getbirthday(){

return teacherbirthday;

}

public void setschoolname(String schoolname){

this.schoolname=schoolname;

}

public void setclassname(String classname){

this.classname=classname;

}

public void setfamilyaddress(String familyaddress){

this.familyaddress=familyaddress;

}

public String getschoalname(){

return schoolname

}

public String getclassname(){

return classname;

}

public String getfamilyaddress(){

return familyaddress;

}

//重寫toString()方法以使得對象能夠以字符串形式輸出的方法

public String toString(){

String infor="學校名稱:"+schoolname+" "+"班級名稱:"+classname+" "+"教師姓名:"+steachername+" "+"教師工號:"+teachercode+" "+"性別:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress;

return infor;

}

}

public class test7{

public static void main(String[] args){

ThreeMap tm=new ThreeMap ();

//創建6個教師對象

teacher tl=new teacher("趙浩","1234001","男","1981-01-02");

teacher t2=new teacher("黎平","1234002","男","1982-08-09");

teacher t3=new teacher("王鵬","1234003","男","1982-11-22");

teacher t4=new teacher("宋波","1234004","女","1982-11-02");

teacher t5=new teacher("童偉","1234005","男","1980-01-12");

teacher t6=new teacher("孫君","1234006","女","1981-09-22");

tl.setschoolname("重慶大學");

tl.setclassname("計算機三班"’),

tl.setfamilyaddress("重慶沙坪壩");

t2.setschoolname("重慶大學"”);

t2.setclassname("計算機三班");

t2.setfamilyaddress("重慶沙坪壩");

t3.setschoolname("重慶大學");

t3.setclassname("計算機三班");

t3.setfamilyaddress("重慶沙坪壩");

t4.setschoolname("重慶大學");

t4.setclassname("計算機三班");

t4.setfamilyaddress("重慶沙坪壩");

t5.setschoolname("重慶大學");

t5.setclassname("計算機三班");

t5.setfamilyaddress("重慶沙坪壩");

t6.setschoolname("重慶大學");

t6.setclassnarne("計算機三班");

t6.setfamilyaddress("重慶沙坪壩");

//通過設置器賦值給對象

tm.put("ab", t1);//添加對象到樹映像

tm.put("1p",t2);

tm.put("wp",t3);

tm.put("sb",t4);

tm.put("zw",t5);

tm.put("sj",t6);

System.out.println("這個小組有"+tm.siae()+"個教師。");

System.out.println(tm.values());

tm.remove("lp");//刪除樹映像中的元素

tm.remove("sb");

System.out.println("幫我查找一下有沒有孫君這個教師");

if(tm.containsKey("sj")){

System.out.println("這個教師是存在的,他的信息如下:");

System.out.println((teacher)tm.get("sj"));

} else{

System.out.println("這里沒有這個教師。");

}

System.out.println("由於有些教師離開了學校,經過我們的審核后,教師信息如下:");

System.out.println(tm.values());

System.out.println("這些教師今天都離開了,所有教師信息都可以刪除了!");

tm.remove("zh");

tm.remove("sj");

tm.remove("zw");

tm.remove("wp");

if(tm.isEmpty()){

System.out.println("這里把教師信息都刪除了");

}else{

System.out.println("系統報錯了!");

}

}

常見問題

哪些是線程安全的數據結構

下面是線程安全的同步的類。

口Vector:比ArrayList多了個同步化機制(線程安全)。

口Statck:堆棧類,先進后出。

口Hashtable:比HashMap多了個線程安全。

口Enumeration:枚舉,相當於迭代器。

除了這些之外,其他的都是非線程安全的類和接口。線程安全類的方法是同步的,每次只能一個訪問,是重量級對象,效率較低。對干1卜線程安個的類和接口,在多線程中需要程序員

自己處理線程安全問題。

Vector是什么樣的數據結構

答:沒有講述它的原因,是因為目前使用它的頻率不高。一般用數組列表代替它,因為它們的使用方法幾乎一樣,唯獨不同的就在線程安全方面。數組列表是非線程安全類,在實現線程編程時,要自己處理安全問題,而Vector則是線程安全類,會自動處理安全問題。

Vector類提供實現可增長數組的功能,隨着更多元素加人其中,數組變得更大。在刪除一些元素之后,數組變小。Vector有3個構造函數:

public  Vector(int initialCapacity,int capacityIncrement)

public  Vector(int initialCapacity)

public  Vector()

Vector運行時創建一個初始的存儲容量initialCapacity.存儲容量是以capacityIncrement變量定義的增量增長。初始的存儲容量和capacityIncrement可以在Vector的構造函數中定義,第2個構造函數只創建初始存儲容量。第3個構造函數既不指定初始的存儲容量,也不指定capacityIncrement。 Vector類提供的訪問方法,支持類似數組的運算,也支持與Vector大小相關的運算。類似數組的運算允許向量中增加、刪除和插入元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值