android基礎學習-java篇day8-step3-第四節:java集合

發條魚發表於2018-09-10

什麼是java集合?

java中的集合是工具類,可以儲存任意數量的具有共同屬性的物件

集合和陣列的區別? 

陣列:儲存固定長度的資訊

集合:長度不固定,適用於資料動態變化的場景

集合應用場景: 

  • 無法預測資料儲存的數量
  • 同時儲存具有一對一關係的資料
  • 需要進行資料的增刪
  • 資料重複問題

集合框架的體系結構 

List(列表 )

  • List是元素有序並且可以重複的集合,稱為序列
  • List可以精確的控制每個元素的插入位置,或刪除某個位置的元素
  • List的兩個主要實現類是ArrayList和LinkedList

ArrayList概述

  • -ArrayList底層是由陣列實現的
  • -動態增長,以滿足應用程式的需求
  • -在列表尾部插入或刪除資料非常有效
  • -更適合查詢和更新元素
  • -ArrayList中的元素可以為null

 方法的簡單案例1:

package com.demo.day8.list;

import java.util.ArrayList;
import java.util.List;

public class ListDemo1 {

	public static void main(String[] args) {
		// 用ArrayList儲存程式語言的名稱,並輸出
		List list=new ArrayList();
		list.add("Java");
		list.add("C");
		list.add("C++");
		list.add("Go");
		list.add("Swift");
		//輸出列表中元素的個
		System.out.println("列表中元素的個數為:"+list.size());
		System.out.println("***********************");
		//輸出列表中的元素
		System.out.println("列表中的元素為:");
		for(int i=0;i<list.size();i++){
			System.out.print(list.get(i)+",");
			
		}
		//移除列表中的++
		list.remove(2);
		//list.remove("C++");
		System.out.println();
		System.out.println("移除C++後的列表元素為:");
		//增強for迴圈遍歷序列
//		for(Object str:list) {
//			System.out.print(str+",");
//		}
		for(int i=0;i<list.size();i++){
			System.out.print("第"+(i+1)+"個為"+list.get(i)+",");
			
		}

	}

}

輸出:

列表中元素的個數為:5
***********************
列表中的元素為:
Java,C,C++,Go,Swift,
移除C++後的列表元素為:
第1個為Java,第2個為C,第3個為Go,第4個為Swift,

案例2:公告管理

需求:

  • -公告的新增和顯示
  • -在指定位置處插入公告
  • -刪除公告
  • -修改公告

公告屬性:

  • -編號id
  • -標題title
  • -建立人creator
  • -建立時間creatTime

公告類方法:

  • -構造方法
  • -獲取和設定屬性的方法

Notice.java

package com.demo.day8.list;

import java.util.Date;

public class Notice {
	/*
	 * 需求:
	 * -公告的新增和顯示
	 * -在指定位置處插入公告
	 * -刪除公告
	 * -修改公告
	 */
	/*
	 * 公告屬性:
	 * -編號id
	 * -標題title
	 * -建立人creator
	 * -建立時間creatTime
	 * 公告類方法:
	 * -構造方法
	 * -獲取和設定屬性的方法
	 */
	private int id;
	private String title;
	private String creator;
	private Date createTime;
	 
	//帶參參建構函式
	public Notice(int id,String title,String creator,Date createTime) {
		this.setCreateTime(createTime);
		this.setCreator(creator);
		this.setId(id);
		this.setTitle(title);
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getCreator() {
		return creator;
	}

	public void setCreator(String creator) {
		this.creator = creator;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public static void main(String[] args) {
		// 
	}

}

 NoticeTest.java

package com.demo.day8.list;

import java.util.ArrayList;
import java.util.Date;

public class NoticeTest {

	public static void main(String[] args) {
		// 建立公告物件
		Notice notice1=new Notice(1,"我是公告1","1",new Date());//取系統當前時間
		Notice notice2=new Notice(2,"我是公告2","2",new Date());
		Notice notice3=new Notice(3,"我是公告3","3",new Date());
        
		ArrayList noticeList=new ArrayList();
		
		//新增公告
		noticeList.add(notice1);
		noticeList.add(notice2);
		noticeList.add(notice3);
		
		//顯示公告
		System.out.println("這裡是公告");
		for(int i=0;i<noticeList.size();i++)
		{   //強制型別轉換成Notice用getTitle的方式顯示標題
			System.out.println((i+1)+"、"+((Notice)(noticeList.get(i))).getTitle());
		}
		
		System.out.println("=========指定新增========");
		//在第一條公告後面新增新的一條公告
		Notice notice4=new Notice(4,"我是公告4","4",new Date());
        noticeList.add(1, notice4);
        for(int i=0;i<noticeList.size();i++)
		{   //強制型別轉換成Notice用getTitle的方式顯示標題
			System.out.println((i+1)+"、"+((Notice)(noticeList.get(i))).getTitle());
		}
        
    	System.out.println("=========刪除=========");
		//刪除公告
        noticeList.remove(2);
        for(int i=0;i<noticeList.size();i++)
		{   //強制型別轉換成Notice用getTitle的方式顯示標題
			System.out.println((i+1)+"、"+((Notice)(noticeList.get(i))).getTitle());
		}
        
    	System.out.println("=========修改=========");
    	notice4.setTitle("我是公告2");
    	noticeList.set(1, notice4);
    	  for(int i=0;i<noticeList.size();i++)
  		{   //強制型別轉換成Notice用getTitle的方式顯示標題
  			System.out.println((i+1)+"、"+((Notice)(noticeList.get(i))).getTitle());
  		}
	}

}

輸出結果:

這裡是公告
1、我是公告1
2、我是公告2
3、我是公告3
=========指定新增========
1、我是公告1
2、我是公告4
3、我是公告2
4、我是公告3
=========刪除=========
1、我是公告1
2、我是公告4
3、我是公告3
=========修改=========
1、我是公告1
2、我是公告2
3、我是公告3

Set

set是元素無序並且不可以重複的集合,被稱為集

 

HashSet

  • HashSet是Set的一個重要實現類,稱為雜湊集
  • HashSet的元素無序並且不可以重複
  • HashSet中只允許一個null元素
  • 具有良好的存取和查詢效能

 案例:用HashSet儲存多個表示顏色額英文單詞,並輸出

  • 單詞包括:“blue”、“red”、“black”、“yellow”和“white”

Iterator(迭代器)

  • Iterator介面可以統一的方式對各種集合元素進行遍歷
  • hasNext()方法檢查集合中是否還有下一個元素
  • next()方法返回集合中的下一個元素

W​ordDemo.java

package com.demo.day8.list;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class WordDemo {

	public static void main(String[] args) {
		// 將英文單詞新增到HashSet中
		//用Set的引用指向HashSet的物件
		Set set=new HashSet();
		//向集合新增元素
		set.add("blue");
		set.add("red");
		set.add("black");
		set.add("yellow");
		set.add("white");
		
		//顯示集合的內容
		System.out.println("顯示集合內容");
		//迭代器
		Iterator it=set.iterator();
		//遍歷迭代器並輸出元素 has.Next()檢查集合中是否還有下一個元素
		while(it.hasNext())
		{
			System.out.print(it.next()+"、");
		}
		System.out.println();
		//在集合中插入一個新的單詞
		set.add("white");
		it=set.iterator();
		while(it.hasNext()) {
			System.out.print(it.next()+"、");
		}
		//插入失敗。但是不會報錯
	}

}

​​​​​​案例:寵物貓資訊管理

需求:

  • -新增和顯示寵物貓的資訊
  • -查詢某隻寵物貓的資訊並輸出
  • -修改寵物貓的資訊
  • -刪除寵物貓的資訊 

屬性:

  • -名字name
  • -年齡month
  • -品種species

方法:

  • -構造方法
  • -獲取和設定屬性值的方法
  • -其他方法

Cat.java

package com.demo.day8.list;

public class Cat {
	// 寵物貓的案例
	private String name;
	private int age;
	private String sex;
	private String species;

	public Cat() {

	}

	// Cat有參構造
	public Cat(String name, int age, String sex, String species) {
		this.setAge(age);
		this.setSpecies(species);
		this.setName(name);
		this.setSex(sex);
	}

	public static void main(String[] args) {

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getSpecies() {
		return species;
	}

	public void setSpecies(String species) {
		this.species = species;
	}

	// 重寫hashCode的方法和equals方法
    //如果兩個物件hashCode不相等,就是不相等
    //如果兩個物件hashCode相等,還要用equals還確定他們屬性是否相等
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
		result = prime * result + ((species == null) ? 0 : species.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj.getClass() == Cat.class) {
			Cat cat = (Cat) obj;
			return (cat.getAge()==age)&&cat.getName().equals(name) && cat.getSex().equals(sex) && cat.getSpecies().equals(species);
		}

		return false;
	}

	// 重寫toString的方法
	@Override
	public String toString() {
		return "Cat [姓名=" + name + ", 年齡=" + age + ", 性別=" + sex + ", 品種=" + species + "]";
	}

}

CatTest.java

package com.demo.day8.list;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {

	public static void main(String[] args) {
		System.out.println("===========新增和顯示貓的資訊===========");
		// 新增和顯示貓的資訊
		Cat one=new Cat("tutu",1,"男","中華田園貓");
		Cat two=new Cat("huahua",2,"女","波斯貓");
		Cat three=new Cat("niuniu",3,"女","本地貓");
		Set<Cat> set=new HashSet<Cat>();
		//新增資訊
		set.add(one);
		set.add(two);
		set.add(three);
		//顯示資訊 迭代器 //<Cat>限制換型
		Iterator<Cat> it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next()+",");//重寫toString顯示字串
		}
		
		System.out.println("===========新增重複的一隻貓的資訊===========");
		Cat four=new Cat("niuniu",3,"女","本地貓");
		set.add(four);
		//顯示資訊 迭代器
		//自定義類重寫hashCode和equals方法
				Iterator<Cat> it2=set.iterator();
				while(it2.hasNext()) {
					System.out.println(it2.next()+",");//重寫toString顯示字串
				}
				
		System.out.println("===========查詢的一隻貓的資訊並顯示===========");		
		//通過該名字查詢
		boolean flag=false;
		Cat c=null;
		//放到迭代器中
	    it=set.iterator();
		//遍歷內容
		while(it.hasNext()) {
			c=(Cat)it.next();//強制轉換
			if(c.getName().equals("huahua")) {
				flag=true;//找到了
				break;
			}
		
		}
		if(flag)
		{   System.out.println("找到了");
		    System.out.println(c);//輸出查到的結果
		}
		else
			System.out.println("沒找到");
		
		System.out.println("===========刪除的指定名字為huahua的貓的資訊並重新顯示===========");
		//增強for迴圈
		for(Cat cat:set) {
			if("huahua".equals(cat.getName()))
				set.remove(cat);break;
		}
		for(Cat cat:set) {
		        System.out.println(cat);
		}
		System.out.println("===========刪除的指定某個範圍貓的資訊並重新顯示===========");
		//刪除年齡小於3的
		Set<Cat> set1=new HashSet<Cat>();
		for(Cat cat:set) {
			if(cat.getAge()<3)
				{
				set1.add(cat);//將查詢到的裝到一個新的序列物件中
				}
		}
		set.removeAll(set1);//通過remove一個新的序列物件,來刪除這一塊
		for(Cat cat:set) {
	        System.out.println(cat);
	}
//		
//		System.out.println("===========刪除的所有隻貓的資訊並重新顯示===========");
//		boolean flag1=set.removeAll(set);
//		if(flag1)
//			System.out.println("貓都不見了");
//		else
//			System.out.println("貓還在");
		
	}

}

輸出結果:

===========新增和顯示貓的資訊===========
Cat [姓名=tutu, 年齡=1, 性別=男, 品種=中華田園貓],
Cat [姓名=huahua, 年齡=2, 性別=女, 品種=波斯貓],
Cat [姓名=niuniu, 年齡=3, 性別=女, 品種=本地貓],
===========新增重複的一隻貓的資訊===========
Cat [姓名=tutu, 年齡=1, 性別=男, 品種=中華田園貓],
Cat [姓名=huahua, 年齡=2, 性別=女, 品種=波斯貓],
Cat [姓名=niuniu, 年齡=3, 性別=女, 品種=本地貓],
===========查詢的一隻貓的資訊並顯示===========
找到了
Cat [姓名=huahua, 年齡=2, 性別=女, 品種=波斯貓]
===========刪除的指定名字為huahua的貓的資訊並重新顯示===========
Cat [姓名=tutu, 年齡=1, 性別=男, 品種=中華田園貓]
Cat [姓名=huahua, 年齡=2, 性別=女, 品種=波斯貓]
Cat [姓名=niuniu, 年齡=3, 性別=女, 品種=本地貓]
===========刪除的指定某個範圍貓的資訊並重新顯示===========
Cat [姓名=niuniu, 年齡=3, 性別=女, 品種=本地貓]

Map概述

  • Map中的資料是以鍵值對(Key-value)的形式儲存
  • Key-value以Entry型別的物件例項存在
  • 可以通過Key值快速地查詢value
  • 一個對映不能包含重複的鍵
  • 每個鍵最多隻能對映到一個值

HashMap

  • 基於雜湊表的Map介面的實現
  • 允許使用null值和null鍵
  • key值不允許重複
  • HashMap中Entry的物件是無序排列的

增強for迴圈:

語法格式:  
  for(資料型別  變數名  :遍歷的目標)

{   //資料型別  變數名:宣告一個變數用來接收遍歷目標遍歷後的元素 }

HashMap案例:

/*完成一個類似字典功能

* 1、新增單詞以及單詞的註釋儲存在HashMap當中

* 2、顯示HashMap中的內容

* 3、查詢某個單詞的註釋並顯示

*/

MapDemo.java

package com.demo.day8.list;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class MapDemo {
	/*完成一個類似字典功能
	 * 1、新增單詞以及單詞的註釋儲存在HashMap當中
	 * 2、顯示HashMap中的內容
	 * 3、查詢某個單詞的註釋並顯示
	 */

	public static void main(String[] args) {
		// map引用指向HaspMap物件 Map<K,V> 泛值
		Map<String,String> map=new HashMap<String,String>();
		System.out.println("請輸入三組單詞對應的註釋,並存放到HashMao中");
		Scanner console=new Scanner(System.in);
		//從鍵盤中輸入值
		//新增
		int i=0;
		while(i<3) {
		System.out.println("請輸入key值:");
		String key=console.next();
		System.out.println("請輸入value值:");
		String value=console.next();
		map.put(key, value);//將鍵值存檔map中
		i++;
		}
		//列印輸出value的值(直接使用迭代器)
		Iterator<String> it=map.values().iterator();
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		System.out.println();
		System.out.println("=========================");
		System.out.println("列印輸出key-value的值 通過entrySet方法得到key-value");
        //列印輸出key-value的值 通過entrySet方法得到key-value
		Set<Entry<String,String>> entrySet=map.entrySet();
		for(Entry<String,String>entry:entrySet)
		{
			//entry.getValue();
			//entry.getKey();
			System.out.println(entry.getKey()+"-"+entry.getValue());
		}
		//通過單詞找到註釋並輸出
		 System.out.println("請輸入你要找的vaule對應的key!");
		String strSearch=console.next();
		boolean flag=false;
		//使用KeySet()
		//1取得keySet
		Set<String> keySet=map.keySet();
		//2遍歷keySet
		for(String key:keySet) {
			if(strSearch.equals(key)) {
				flag=true;
				System.out.println("找到了!鍵值對為"+key+"-"+map.get(key));
				break;
			}
			 
		}
	         if(!flag)
	        	 System.out.println("找不到!");
		
	}

}

輸出結果:

請輸入三組單詞對應的註釋,並存放到HashMao中
請輸入key值:
a
請輸入value值:
A
請輸入key值:
b
請輸入value值:
B
請輸入key值:
c
請輸入value值:
C
A B C 
=========================
列印輸出key-value的值 通過entrySet方法得到key-value
a-A
b-B
c-C
a
找到了!鍵值對為a-A

案例2:商品資訊管理

/*
 * 分析商品資訊類
 * 屬性:
 * -商品編號:id
 * -商品名稱:name
 * -商品價格:price
 * 方法:
 * -構造方法
 * -獲取和設定屬性值的方法
 * -其他方法
 */

package com.demo.day8.list;
/*
 * 分析商品資訊類
 * 屬性:
 * -商品編號:id
 * -商品名稱:name
 * -商品價格:price
 * 方法:
 * -構造方法
 * -獲取和設定屬性值的方法
 * -其他方法
 */
public class Goods {
	private String goodsId;
	private String goodsName;
	private double goodsPrice;
	public Goods(String goodsId,String goodsName,double goodsPrice) {
		this.setGoodsId(goodsId);
		this.setGoodsName(goodsName);
		this.setGoodsPrice(goodsPrice);
		
	}

	

	public String getGoodsId() {
		return goodsId;
	}



	public void setGoodsId(String goodsId) {
		this.goodsId = goodsId;
	}



	public String getGoodsName() {
		return goodsName;
	}



	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}



	public double getGoodsPrice() {
		return goodsPrice;
	}



	public void setGoodsPrice(double goodsPrice) {
		this.goodsPrice = goodsPrice;
	}

   //toString方法
	public String toString() {
	   String str="商品編號:"+goodsId+" "+"商品名稱:"+goodsName+" "+"商品價格:"+goodsPrice;
		
	   return str;
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

GoodsTest.java

package com.demo.day8.list;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class GoodsTest {
	/*
	 * 使用HashMap對商品資訊進行管理
	 * -其中key為商品編號,value為商品物件
	 * HashMap中的商品資訊進行增、刪、改、查
	 */

	public static void main(String[] args) {
		Scanner console=new Scanner(System.in);
		// 定義HashMap物件
    Map<String,Goods> map=new HashMap<String,Goods>();
   System.out.println("請輸入三條商品資訊:");
   int i=0;
		   while(i<3) {
			   System.out.println("請輸入第"+(i+1)+"條商品資訊");
			   System.out.println("請輸入商品的編號:");
			   String goodsId=console.next();
			   if(map.containsKey(goodsId)) {//如果編號已經存在
				   System.out.println("商品編號已經存在");
				   continue;//程式繼續執行上一條
			   }
			   System.out.println("請輸入商品的的名稱:");
			   String goodsName=console.next();
			   try {//如果有需要錯誤的id,會處理這個異常,不影響程式正常執行
			   System.out.println("請輸入商品的的價格:");
               }catch(Exception e) {
            	   System.out.println("商品價格輸入格式錯誤");
            	   console.next();
				   continue;
			   }
			   double goodsPrice=console.nextDouble();
			   Goods goods=new Goods(goodsId, goodsName, goodsPrice);
			   //將商品資訊新增到HashMap中
			   map.put(goodsId,goods);
			   i++;
			   
		   }
		   //遍歷Map,輸出商品資訊
		   System.out.println("商品全部資訊為:");
		   Iterator<Goods> it=map.values().iterator();
		   while(it.hasNext())
			   System.out.println(it.next());
	}

}

輸出:

請輸入三條商品資訊:
請輸入第1條商品資訊
請輸入商品的編號:
1
請輸入商品的的名稱:
1
請輸入商品的的價格:
1
請輸入第2條商品資訊
請輸入商品的編號:
2
請輸入商品的的名稱:
2
請輸入商品的的價格:
2
請輸入第3條商品資訊
請輸入商品的編號:
3
請輸入商品的的名稱:
3
請輸入商品的的價格:
3
商品全部資訊為:
商品編號:1 商品名稱:1 商品價格:1.0
商品編號:2 商品名稱:2 商品價格:2.0
商品編號:3 商品名稱:3 商品價格:3.0

 

相關文章