1. 程式人生 > 其它 >雙列集合Map

雙列集合Map

技術標籤:java基礎java

一、雙列集合Map

1.1Map概述

雙列集合是每個元素都有鍵和值兩部分組成的集合,記錄的是鍵值對對應關係。

最常見的Map集合是HashMap:鍵是唯一的且無序。

方法:put(key,value);

get(key);

/*
* Map:雙列集合,每個元素分為鍵與值兩部分,是一個鍵值得對應關係.我們經常使用鍵找值
* 最常用的Map集合是HashMap:鍵是唯一的且無序
*       用法:
* 		put(key, value);
* 		get(key);
*
* */
public class MapDemo {
    public static void main(String[] args) {
        //建立集合物件
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("姓名", "小力");
        map.put("年齡","22");
        map.put("性別","男");
        //通過鍵獲取值
        String name = map.get("姓名");
        System.out.println(name);


    }

}

1.2Map基本使用

1.Map(HashMap)的使用:建立物件時加入兩個泛型。

Map<k,v>

key - 此對映所維護的鍵的型別

value - 對映值的型別

2.常用方法:

public V put(K key,V value) //加入元素,則新值會覆蓋掉舊值

public V get(Object key) //根據鍵找值

public Set<K> keySet() //返回所有鍵的集合

public Collection<V> values() //返回所有值的集合

Map(HashMap)的使用:建立物件時加入兩個泛型。
*  		Map<k,v>
*  		key - 此對映所維護的鍵的型別
*  		value - 對映值的型別
*  
*  		常用方法:
*  			public V put(K key,V value)		//加入元素,則新值會覆蓋掉舊值
*  			public V get(Object key)		//根據鍵找值
*  			public Set<K> keySet()			//返回所有鍵的集合
*  			public Collection<V> values()  	//返回所有值的集合
*  
*/

public class MapDemo {
	public static void main(String[] args) {
		//建立集合物件
		HashMap<String, String> map = new HashMap<String, String>();
		
		//向集合中新增元素
		map.put("及時雨", "宋江");
		map.put("玉麒麟", "盧俊義");
		map.put("母夜叉", "高俅");
		map.put("智多星", "吳用");
		
		System.out.println(map);
		//可以通過鍵獲取值
		String name = map.get("及時雨");
		System.out.println(name);
		
		String name2 = map.get("母夜叉");
		System.out.println(name2);
	}
}

1.3Map集合遍歷方式1

1種遍歷方式是,使用Map集合keySet()方法

Map(HashMap)的使用:建立物件時加入兩個泛型。
*  		Map<k,v>
*  		key - 此對映所維護的鍵的型別
*  		value - 對映值的型別
*  
*  		常用方法:
*  			public V put(K key,V value)		//加入元素,則新值會覆蓋掉舊值
*  			public V get(Object key)		//根據鍵找值
*  			public Set<K> keySet()			//返回所有鍵的集合
*  			public Collection<V> values()  	//返回所有值的集合
*  
*  	Map沒有迭代器方法,最常用的遍歷方法:先獲取所有鍵的集合,迭代該集合,依次獲取每一個鍵.通過鍵找值.
*/

public class MapDemo {
	public static void main(String[] args) {
		//建立集合物件
		HashMap<String, String> map = new HashMap<String, String>();
		
		//向集合中新增元素
		map.put("及時雨", "宋江");
		map.put("玉麒麟", "盧俊義");
		map.put("智多星", "高俅");
		map.put("智多星", "吳用");
		
		//返回所有鍵的集合
		Set<String> keySet = map.keySet();
		System.out.println(keySet);
		
		//返回所有值得集合
		Collection<String> values = map.values();
		System.out.println(values);
				
		System.out.println("==========================");
		
		//map集合的常用遍歷		
		//迭代所有鍵的Set集合,依次獲取每一個鍵
		Iterator<String> iterator = keySet.iterator();
		
		while(iterator.hasNext()) {
			String thisKey = iterator.next();
			//通過鍵找值,記住這裡使用map集合通過鍵找值
			String thisValue = map.get(thisKey);
			System.out.println(thisKey+"="+thisValue);
		}

	}
}

1.4Map集合遍歷方式2

第2種遍歷方式是,使用Map集合entrySet()方法

public class EntrySetDemo {
    public static void main(String[] args) {
        //建立集合物件
        HashMap<String, String> map = new HashMap<String, String>();

        //向集合中新增元素
        map.put("及時雨", "宋江");
        map.put("玉麒麟", "盧俊義");
        map.put("智多星", "吳用");

        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for(Map.Entry<String,String> entry:entrySet){
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key +"="+ value);

        }

    }
}

1.5LinkedHashMap

LinkedHashMap:

* Linked連結串列結構,保證元素有順序

* Hash結構保證元素唯一

* 以上約束對鍵起作用

二、集合相關其他

1.Collections的shuffle方法

shuffle方法的作用:

打亂集合中元素順序

public class CollectionsDemo {
	public static void main(String[] args) {
		//準備集合及元素
		List<Integer> list = new ArrayList<Integer>();
		
		list.add(2);
		list.add(7);
		list.add(6);
		list.add(10);
		list.add(9);
		
		//打亂前的順序,就是放入元素的先後順序
		System.out.println(list);
		
		//打亂集合順序
		Collections.shuffle(list);
		//列印集合
		System.out.println(list);		
	}
}

2.Collections的sort方法

public static <T>void sort(List<T>list) //排序

* 排序:不管是第幾個放的,只要到集合中(以Integer集合為例),就按照一定的順序重新排列了.

3.Collections的二分查詢

1. binarySearch方法的作用

查詢集合中指定元素的索引

public static <T>intbinarySearch(List<?>list,T key)

二分法查詢:在一個集合當中,查詢一個指定元素的索引是多少,如果不存在該元素,就返回負數索引

public class CollectionsDemo {
	public static void main(String[] args) {
		
		//驗證二分法查詢元素必須有序
		List<Integer> list = new ArrayList<Integer>();
		
		list.add(2);
		list.add(7);
		list.add(6);
		list.add(10);
		list.add(9);
		
		int binarySearch = Collections.binarySearch(list, 9);
		System.out.println(binarySearch);
		
		Collections.sort(list);
		System.out.println(list);
		
		int binarySearch2 = Collections.binarySearch(list, 9);
		System.out.println(binarySearch2);

	}
}

4.Arrays的toString方法

toString方法的作用:

返回字串內容

public static String toString(Xxx[] a)

public class ArraysDemo {
	public static void main(String[] args) {
		String[] arr = {"Jack","Rose","Trump"};
		//Integer[] arr = {3,1,5,6,2,19};
		
		System.out.println(arr);
		
		//呼叫Arrays的toString方法
		System.out.println(Arrays.toString(arr));

	}
}

結果:[Jack, Rose, Trump]

5.陣列轉集合

陣列轉集合使用的是,Arrays類中的asList方法

注意

陣列轉成集合之後該集合不支援新增或者刪除操作否則會丟擲UnsupportedOperationException異常

public class ArraysAsListDemo {
	public static void main(String[] args) {
		List<String> newList = Arrays.asList("Jack","Rose","Trump");
		System.out.println(newList);
		
		//使用asList轉成的集合,不能新增或者刪除元素,該方法返回的集合長度不能改變!所以,下面程式碼執行報錯.
		newList.add("Obama");
		System.out.println(newList);
	}
}

6.集合轉陣列

集合ArrayList轉陣列使用的是,ArrayList中的toArray()方法

public class ArrayListToArrayDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();

        list.add(2);
        list.add(7);
        list.add(6);
        list.add(10);
        list.add(9);

        Object[] objects = list.toArray();
        String s = Arrays.toString(objects);
        System.out.println(s);

    }
}

三、鬥地主洗牌案例

按照鬥地主的規則,完成洗牌發牌的動作。

具體規則:

1. 組裝54張撲克牌

2. 將54張牌順序打亂

3. 三個玩家參與遊戲,三人交替摸牌,每人17張牌,最後三張留作底牌。

4. 檢視三人各自手中的牌(按照牌的大小排序)、底牌

手中撲克牌從大到小的擺放順序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

package com.igeek;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class CardDemo {
    //鬥地主案例
    public static void main(String[] args) {
        //確立紙牌與數字的對應關係
        Map<Integer, String> map = new HashMap<Integer, String>();
        //花色集合
        ArrayList<String> colors = new ArrayList<String>();
        colors.add("♣");
        colors.add("♦");
        colors.add("♠");
        colors.add("♥");
        //數字集合,加入數字時,直接按照從小到大的順序加入
        ArrayList<String> numbers = new ArrayList<String>();
        for(int i=3;i<=10;i++){
            numbers.add(i+"");

        }
        Collections.addAll(numbers,"J","Q","K","A","2");

        //定義數字,用於記錄數字與字串紙牌的對應關係
        int cardNumber = 0;
        //遍歷數字集合,使用每個數字匹配每種花色
        for(String number:numbers){
            for(String color:colors){
                String card = color + number;
                map.put(cardNumber,card);
                cardNumber++;
            }

        }
        //加入大小王對應關係
        map.put(cardNumber++, "小☺");//cardNumber++先引用後增加
        map.put(cardNumber,"大☺");
        System.out.println(map);
        //準備牌:
        ArrayList<Integer> poker = new ArrayList<Integer>();
        for(int i = 0; i<54; i++) {
            poker.add(i);
        }
        //打亂順序
        Collections.shuffle(poker);
        //發牌:
        //將每個人以及底牌設計為ArrayList<Integer>,將最後3張牌直接存放於底牌,剩餘牌通過對3取模依次發牌。
        ArrayList<Integer> player01 = new ArrayList<Integer>();
        ArrayList<Integer> player02 = new ArrayList<Integer>();
        ArrayList<Integer> player03 = new ArrayList<Integer>();
        ArrayList<Integer> dipai = new ArrayList<Integer>();

        for(int index = 0; index <poker.size()-3; index++) {
            //通過索引,獲取代表牌的數字
            Integer integerCard = poker.get(index);

            //對3取模判斷髮給哪個玩家
            if(index%3==0) {
                player01.add(integerCard);
            }else if(index%3==1){
                player02.add(integerCard);
            }else{
                player03.add(integerCard);
            }
        }
        //最後3張是底牌
        for(int index=poker.size()-3; index<poker.size(); index++){
            //獲取當前這張牌
            Integer integerCard = poker.get(index);
            dipai.add(integerCard);
        }
        //將所有集合排序Collections類的sort方法進行排序
        Collections.sort(player01);
        Collections.sort(player02);
        Collections.sort(player03);
        Collections.sort(dipai);
        //看牌
        for(int i=player01.size()-1;i>=0;i--) {
            Integer integer = player01.get(i);
            String realCard = map.get(integer);
            System.out.print(realCard+"  ");
        }
        System.out.println();

        for(int i=player02.size()-1;i>=0;i--) {
            Integer integer = player02.get(i);
            String realCard = map.get(integer);
            System.out.print(realCard+"  ");
        }
        System.out.println();

        for(int i=player03.size()-1;i>=0;i--) {
            Integer integer = player03.get(i);
            String realCard = map.get(integer);
            System.out.print(realCard+"  ");
        }
        System.out.println();

        for(Integer integer : dipai) {
            String realCard = map.get(integer);
            System.out.print(realCard+"  ");
        }

    }
}