雙列集合Map
一、雙列集合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+" ");
}
}
}