1. 程式人生 > >Java常用物件API——Map集合

Java常用物件API——Map集合

java.util

介面 Map<K,V>

public interface Map<K,V>
將鍵對映到值的物件。一個對映不能包含重複的鍵;每個鍵最多隻能對映到一個值。

Map集合中儲存的就是鍵值對,且必須保證鍵的唯一性。
與collction的對比:
Map:一次新增一對元素。Collection 一次新增一個元素。
Map也稱為雙列集合,Collection集合稱為單列集合。
注意,Map<K,V>中K,V只能是物件引用型別,所以裡面要寫物件包裝類。

常用方法:

1,新增。
value(這指的是返回值) put

(key,value):返回前一個和key關聯的值(舊值),如果沒有返回null.
2,刪除。
void clear():清空map集合。
value remove(key):根據指定的key刪除這個鍵值對。
3,判斷。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,獲取。
value get(key):通過鍵獲取值,如果沒有該鍵返回null。
當然可以通過返回null,來判斷是否包含指定鍵。
int size(): 獲取鍵值對的個數。

演示

public class MapDemo
{ public static void main(String[] args) { Map<Integer,String> map = new HashMap<Integer,String>(); method(map); } public static void method(Map<Integer,String> map){//學號和姓名 // 新增元素。 System.out.println(map.put(8, "wangcai"));//返回null System.out.println(map.put(8, "xiaoqiang"
));//wangcai 存相同鍵,值會覆蓋。 map.put(2,"zhangsan"); map.put(7,"zhaoliu"); //刪除。 System.out.println("remove:"+map.remove(2)); //判斷。 System.out.println("containskey:"+map.containsKey(7)); //獲取。 System.out.println("get:"+map.get(6)); System.out.println(map); } }

在這裡插入圖片描述

重點方法keySet演示:

Map是沒有迭代器可以直接使用的,通過keySet方法獲取map中所有的鍵所在的Set集合,再通過Set的迭代器獲取到每一個鍵。

public class MapDemo {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new HashMap<Integer,String>();
		method(map);
	}
	public static void method_2(Map<Integer,String> map){
		
		map.put(8,"zhaoliu");
		map.put(2,"zhaoliu");
		map.put(7,"xiaoqiang");
		map.put(6,"wangcai");
		//要取出map中的所有元素,但是map是沒有迭代器可以直接使用的。
		//原理,通過keySet方法獲取map中所有的鍵所在的Set集合,再通過Set的迭代器獲取到每一個鍵
		//再對每一個鍵通過map集合的get方法獲取其對應的值即可。
		
		Set<Integer> keySet = map.keySet();
		Iterator<Integer> it = keySet.iterator();
		
		while(it.hasNext()){
			Integer key = it.next();
			String value = map.get(key);
			System.out.println(key+":"+value);
			
		}
	}

執行結果:
在這裡插入圖片描述

原理圖解:在這裡插入圖片描述

重點方法entrySet演示:

public class MapDemo {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new HashMap<Integer,String>();
		method_2(map);
	}
	
	public static void method_2(Map<Integer,String> map){
		
		map.put(8,"zhaoliu");
		map.put(2,"zhaoliu");
		map.put(7,"xiaoqiang");
		map.put(6,"wangcai");
		/*
		 * 通過Map轉成set就可以迭代。
		 * 找到了另一個方法。entrySet。
		 * 該方法將鍵和值的對映關係作為物件儲存到了Set集合中,而這個對映關係的型別就是Map.Entry型別(結婚證)
		 * 
		 * 
		 */
		
		Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
		
		Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
		
		while(it.hasNext()){
			Map.Entry<Integer, String> me = it.next();
			Integer key = me.getKey();
			String value = me.getValue();
			System.out.println(key+"::::"+value);
			
		}
	}
	

執行結果:
在這裡插入圖片描述

原理圖解:
在這裡插入圖片描述

values方法

這個方法可以只獲取值

		//.....................
		map.put(8,"zhaoliu");
		map.put(2,"zhaoliu");
		map.put(7,"xiaoqiang");
		map.put(6,"wangcai");
		
		
		Collection<String> values = map.values();
		
		Iterator<String> it2 = values.iterator();
		while(it2.hasNext()){
			System.out.println(it2.next());
		}

執行結果:
在這裡插入圖片描述

Map常用的子類:

|–Hashtable :內部結構是雜湊表,是同步的。不允許null作為鍵,null作為值。
…|–Properties:用來儲存鍵值對型的配置檔案的資訊,可以和IO技術相結合。
|–HashMap : 內部結構是雜湊表,不是同步的。允許null作為鍵,null作為值。
|–TreeMap : 內部結構是二叉樹,不是同步的。可以對Map集合中的鍵進行排序。

HashMap演示:

	public static void main(String[] args) {

		
		/*
		 * 將學生物件和學生的歸屬地通過鍵與值儲存到map集合中。
		 * 
		 */
		
		HashMap<Student,String> hm = new HashMap<Student,String>();

		
		hm.put(new Student("lisi",38),"北京");
		hm.put(new Student("zhaoliu",24),"上海");
		hm.put(new Student("xiaoqiang",31),"瀋陽");
		hm.put(new Student("wangcai",28),"大連");
		hm.put(new Student("zhaoliu",24),"鐵嶺");
		
//		Set<Student> keySet = hm.keySet();		
//		Iterator<Student> it = keySet.iterator();
		
		Iterator<Student> it = hm.keySet().iterator();
		
		while(it.hasNext()){
			Student key = it.next();
			String value = hm.get(key);
			System.out.println(key.getName()+":"+key.getAge()+"---"+value);
		}
		
		
	}

}

執行結果:注意,存在了覆蓋情況。(參考HashSet)
在這裡插入圖片描述

TreeMap演示

演示了排序功能。注意比較器的用法,參考上一篇文章。

public class TreeMapDemo {

	
	public static void main(String[] args) {

		TreeMap<Student,String> tm = new TreeMap<Student,String>(new ComparatorByName()); //傳入比較器,通過姓名排序
		
		tm.put(new Student("lisi",38),"北京");
		tm.put(new Student("zhaoliu",24),"上海");
		tm.put(new Student("xiaoqiang",31),"瀋陽");
		tm.put(new Student("wangcai",28),"大連");
		tm.put(new Student("zhaoliu",24),"鐵嶺");
		
		
		Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();
		
		while(it.hasNext()){
			Map.Entry<Student,String> me = it.next();
			Student key = me.getKey();
			String value = me.getValue();
			
			System.out.println(key.getName()+":"+key.getAge()+"---"+value);
		}
		
	}

}

這是通過姓名排序的結果
在這裡插入圖片描述

LinkedHashMap

特點:有序存取
例子:

public class LinkedHashMapDemo {

	
	public static void main(String[] args) {
		
		File f= null;
		HashMap<Integer,String> hm = new LinkedHashMap<Integer,String>(); //有序存取
		hm.put(7, "zhouqi");
		hm.put(3, "zhangsan");
		hm.put(1, "qianyi");
		hm.put(5, "wangwu");
		
		Iterator<Map.Entry<Integer,String>> it = hm.entrySet().iterator();
		
		while(it.hasNext()){
			Map.Entry<Integer,String> me = it.next();
			
			Integer key = me.getKey();
			String value = me.getValue();
			
			System.out.println(key+":"+value);
		}
	}

}

取出來的資料和存入時的順序是一樣的
在這裡插入圖片描述

Map集合練習——獲取字串中每一個字母出現的次數

練習:

  • “fdgavcbsacdfs” 獲取該字串中,每一個字母出現的次數。
  • 要求列印結果是:a(2)b(1)…;

思路

  • 對於結果的分析發現,字母和次數之間存在著對映關係。而且這種關係很多。
  • 很多就需要儲存,能儲存對映關係的容器有陣列和Map集合。
  • 關係一方式有序編號嗎?沒有!
  • 那就是使用Map集合。 又發現可以保證唯一性的一方具備著順序如 a b c …
  • 所以可以使用TreeMap集合。
  • 這個集合最終應該儲存的是字母和次數的對應關係。
  • 1,因為操作的是字串中的字母,所以先將字串變成字元陣列。
  • 2,遍歷字元陣列,用每一個字母作為鍵去查Map集合這個表。
  • 如果該字母鍵不存在,就將該字母作為鍵 ,1作為值儲存到map集合中。
  • 如果該字母鍵存在,就將該字母鍵對應值取出並+1,在將該字母和+1後的值儲存到map集合中,
  • 鍵相同值會覆蓋。這樣就記錄住了該字母的次數.
  • 3,遍歷結束,map集合就記錄所有字母的出現的次數。

程式碼:

public class MapTest {

	
	public static void main(String[] args) {

		
		String str = "fdg+avAdc  bs5dDa9c-dfs";
		
		String s = getCharCount(str);//獲取字元的個數(自己實現)
		
		System.out.println(s);
		
	}

	public static String getCharCount(String str) {
		
		
		//將字串變成字元陣列 
		char[] chs = str.toCharArray(); 
		
		//定義map集合表。
		Map<Character,Integer> map = new TreeMap<Character,Integer>();
		
		for (int i = 0; i < chs.length; i++) {
			
			if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))
//			if(!(Character.toLowerCase(chs[i])>='a' && Character.toLowerCase(chs[i])<='z'))
				continue;
			
			//將陣列中的字母作為鍵去查map表,返回其值			
			Integer value = map.get(chs[i]);
			
			int count = 1;
			
			//判斷值是否為null.
			if(value!=null){
				count = value+1;
			}
//			count++;
			map.put(chs[i], count);
		
		}
		
		
		
		
		
		return mapToString(map);//自己實現
	}

	private static String mapToString(Map<Character, Integer> map) {  //傳入一個Map集合,返回一個字串
		
		StringBuilder sb = new StringBuilder(); //字串緩衝區
		
		Iterator<Character> it = map.keySet().iterator(); //獲得一個Map中所有鍵所在的Set集合,再通過Set建立一個迭代器,以此來獲得每一個鍵
		
		while(it.hasNext()){
			Character key = it.next();  //獲得鍵
			Integer value = map.get(key); //再通過鍵獲得值
			
			sb.append(key+"("+value+")"); //用append方法連成字串
		}
		
		return sb.toString(); //再用字串緩衝區的方法一次性轉化為字串
	}

}

執行結果:在這裡插入圖片描述

Map查表法

Map在有對映關係(甚至特別多)時,可以優先考慮。 在查表法中的應用較為多見。

public class MapTest2 {


	public static void main(String[] args) {

	
		
		String week = getWeek(1);
		System.out.println(week);
		
		System.out.println(getWeekByMap(week));
	}
	public static String getWeekByMap(String week){
		
		Map<String,String> map = new HashMap<String,String>();
		
		map.put("星期一","Mon");
		map.put("星期二","Tus");
		map.put("星期三","Wes");
		map.put("星期日","Sun");
		map.put("星期天","Sun");
		
		return map.get(week);
	}
	
	
	public static String getWeek(int week){
		
		if(week<1 || week>7)
			throw new RuntimeException("沒有對應的星期,請您重新輸入");
		
		String[] weeks = {"","星期一","星期二"};
		
		return weeks[week];
	}

}

執行結果:
在這裡插入圖片描述