基于Map集合重點(diǎn)整理及其撲克牌補(bǔ)充手中牌的排序
Map集合
1.1Map集合概念
- Map集合是一種存放關(guān)系對象的對象的雙列集合棺弊。
img.png
1.2Map集合的常用子類
HashMap<K,V>
- 1.數(shù)據(jù)存儲方式:哈希表結(jié)構(gòu)艾帐。
- 2.存儲情況:無序性
- 3.保證鍵的唯一性方式:需要重寫鍵的hashCode()方法令蛉、equals()方法驶赏。
LinkedHashMap<K,V>聘殖,是HashMap的一個子類凡人。
- 1.數(shù)據(jù)存儲方式:哈希表結(jié)構(gòu)+鏈表結(jié)構(gòu)
存儲數(shù)據(jù)采用的哈希表結(jié)構(gòu)+鏈表結(jié)構(gòu)锋谐。
(1.鏈表結(jié)構(gòu):保證元素的存取順序一致觅玻。
(2.哈希表結(jié)構(gòu):保證的鍵的唯一想际、不重復(fù)。 - 3.同樣需要重寫鍵的 hashCode()方法溪厘、equals()方法胡本。
注意:K, V泛型類型可以一致畸悬,也可以不一致侧甫。
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author lx
* @date 2019/1/3 - 17:25
* public V put(K key, V value) : 把指定的鍵與指定的值添加到Map集合中。
* public V remove(Object key) : 把指定的鍵 所對應(yīng)的鍵值對元素 在Map集合中刪除蹋宦,返回被刪除元素的值披粟。
* public V get(Object key) 根據(jù)指定的鍵,在Map集合中獲取對應(yīng)的值冷冗。
* boolean containsKey(Object key) 判斷集合中是否包含指定的鍵守屉。
* public Set<K> keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中蒿辙。
* public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
*/
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
//添加元素
hashMap.put("馮小剛", "范冰冰");
hashMap.put("李晨", "范冰冰");
//如果鍵相同拇泛,值不同時,直接會覆蓋前面的Value值思灌。
hashMap.put("馮小剛", "徐帆");
hashMap.put("馮紹峰", "趙麗穎");
hashMap.put("霍建華", "林心如");
hashMap.put("楊冪", "劉愷威");
System.out.println(hashMap);
//{馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰, 楊冪=劉愷威}
//通過Key刪除元素
hashMap.remove("楊冪");
System.out.println(hashMap);
//{馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰}
//獲取指定鍵key的value值
String s = hashMap.get("霍建華");
System.out.println(s);//林心如
//判斷集合中是否包含指定鍵
System.out.println(hashMap.containsKey("楊冪"));//在這之前已經(jīng)被刪除了俺叭,返回false
//判斷集合中是否含有指定value值(一般很少用)
System.out.println(hashMap.containsValue("范冰冰"));//true
//獲取集合中的所有鍵,并存儲到集合中
Set<String> set=hashMap.keySet();
System.out.println(set);//[馮紹峰, 霍建華, 馮小剛, 李晨]
//獲取 鍵值對 對象的集合
Set<Map.Entry<String,String>> set1=hashMap.entrySet();
System.out.println(set1);//[馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰]
//遍歷獲取到的鍵值對的集合
for (Map.Entry<String,String> ss:set1) {
System.out.println(ss);
/*
馮紹峰=趙麗穎
霍建華=林心如
馮小剛=徐帆
李晨=范冰冰
*/
}
}
}
Entry鍵值對對象
- Key(鍵)+Value(值)=Map集合中的Entry項(xiàng)泰偿。
- Entry將鍵值對封裝成了鍵值對 對象熄守。方便了我們從每一個Entry對象中獲取對應(yīng)的鍵與對應(yīng)的值。
Map集合遍歷鍵值對的方式
通過集合中每個鍵值對(Entry)對象,獲取鍵值對(Entry)對象中的鍵與值裕照。
- 獲取Map集合中攒发,所有的鍵值對(Entry)對象,以Set集合形式返回晋南。使用entrySet()方法晨继。
- 遍歷包含鍵值對(Entry)對象的Set集合,得到每一個鍵值對(Entry)對象搬俊。
- 通過鍵值對(Entry)對象聪铺,獲取Entry對象中的鍵與值涩拙。使用getkey() 方法和getValue()。
package hashMap_demo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* public K getKey() :獲取Entry對象中的鍵输玷。
* public V getValue() :獲取Entry對象中的值檀葛。
* 在Map集合中也提供了獲取所有Entry對象的方法:
* public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
*/
public class EntryDemo {
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<>();
map.put(20, "aa");
map.put(18, "bb");
map.put(20, "dd");
map.put(25, "gg");
map.put(28, "cc");
// 使用hashMap集合對象調(diào)用entrySet方法獲取Set的所有的entry對象玩祟,
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
int aInt = entry.getKey();
String ss = entry.getValue();
System.out.println(aInt + "cp是" + ss);
//輸出結(jié)果:
//18cp是bb
//20cp是dd
//25cp是gg
//28cp是cc
//Map集合不能直接使用迭代器或者foreach進(jìn)行遍歷。但是轉(zhuǎn)成Set之后就可以使用了
}
}
}
HashMap存儲自定義類型鍵值
- 練習(xí):每位學(xué)生(姓名屿聋,年齡)都有自己的家庭住址空扎。
- 那么,既然有對應(yīng)關(guān)系润讥,則將學(xué)生對象和家庭住址存儲到 map集合中转锈。學(xué)生作為鍵, 家庭住址作為值。
- 注意楚殿,學(xué)生姓名相同并且年齡相同視為同一名學(xué)生撮慨。
package hashMap_demo;
import java.util.Objects;
/**
* @author lx
* @date 2019/1/13 - 18:15
*/
public class Student {
//創(chuàng)建變量
private String name;
private int age;
//默認(rèn)構(gòu)造器
public Student() {
}
//有參構(gòu)造器
public Student(String name, int age) {
this.name=name;
this.age=age;
}
//setter getter方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge() {
this.age = age;
}
//equals方法首先判斷傳入的是否與本類中的相同,相同則返回true
public boolean equals(Object o) {
if (this == o) {
return true;
}//其次再判斷如果為空或者類名不同脆粥,則直接返回false
if (o == null || getClass() != o.getClass()) {
return false;
}
//將Object類型強(qiáng)轉(zhuǎn)為Student類型砌溺,構(gòu)成內(nèi)容給的比較
Student student = (Student) o;
return age == student.age && Objects.equals(name, age);
}
//重寫toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//保證鍵值的唯一性
@Override
public int hashCode() {
return Objects.hash(name,age);
}
}
定義測試類:
package hashMap_demo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author lx
* @date 2019/1/13 - 18:39
*/
public class Entry_Demo {
public static void main(String[] args) {
Map<Student,String> map=new HashMap<>();
map.put(new Student("趙穎", 20), "河北");
map.put(new Student("陳爽", 25), "湖南");
map.put(new Student("張亞藍(lán)", 29), "廈門");
map.put(new Student("呂小童", 32), "陜西");
map.put(new Student("趙穎",20),"山西");
Set<Student> studentSet=map.keySet();
for (Student key:studentSet
) {
String sss = map.get(key);
System.out.println(key+"的住址是"+sss);
/*輸出結(jié)果:
Student{name='趙穎', age=20}的住址是山西
Student{name='陳爽', age=25}的住址是湖南
Student{name='呂小童', age=32}的住址是陜西
Student{name='張亞藍(lán)', age=29}的住址是廈門*/
}
}
}
1.當(dāng)給HashMap中存放自定義對象時,如果自定義對象作為key存在变隔,這時要保證對象唯一规伐,必須復(fù)寫對象的hashCode和equals方法。
2.如果要保證map中存放的key和取出的順序一致匣缘,可以使用 java.util.LinkedHashMap 集合來存放猖闪。
LinkedHashMap
它是HashMap下面有一個子類LinkedHashMap,它是鏈表和哈希表組合的一個數(shù)據(jù)存儲結(jié)構(gòu)孵户。
特點(diǎn):有序萧朝,不可重復(fù)
package hashMap_demo;
import java.util.LinkedHashMap;
/**
* @author lx
* @date 2019/1/13 - 17:12
*/
public class LinkedHashSetDemo {
public static void main(String[] args) {
LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();
linkedHashMap.put("趙麗穎","馮紹峰");
linkedHashMap.put("金玟岐","金玟岐");
linkedHashMap.put("咪咕","王少");
linkedHashMap.put("卡羅","扎西");
linkedHashMap.put("趙麗穎","李易峰");
System.out.println(linkedHashMap);
/*
{趙麗穎=李易峰, 金玟岐=金玟岐, 咪咕=王少, 卡羅=扎西}
*/
}
}
計(jì)算一個字符串中每個字符出現(xiàn)次數(shù)
package hashMap_demo;
import java.util.HashMap;
import java.util.Scanner;
/**
* @author lx
* @date 2019/1/13 - 17:41
* 需求:
* 計(jì)算一個字符串中每個字符出現(xiàn)次數(shù)
* 1.從控制臺獲取字符串
* 2.創(chuàng)建一個集合,一個作為為字符夏哭,一個為次數(shù)
* 3.將字符串轉(zhuǎn)化為字符检柬,逐個遍歷,判斷是否是第一次出現(xiàn)
* 4如果是第一次出現(xiàn),Integer設(shè)置為1何址,不是則先獲取上一次的value值里逆。再加一之后存放
*/
public class JiSuanZifuChuan {
public static void main(String [] args){
//從控制臺錄入字符串
Scanner scanner=new Scanner(System.in);
//獲取字符串
String next = scanner.nextLine();
//創(chuàng)建一個集合,存儲字符和次數(shù)
HashMap<Character, Integer> hashMap = new HashMap<>();
for (int i = 0; i < next.length(); i++) {
//獲取字符
char c = next.charAt(i);
if (!hashMap.containsKey(c)) {
hashMap.put(c, 1);
} else {
//如果不是第一次用爪,先取出來原押,然后再加一
Integer integer = hashMap.get(c);
hashMap.put(c, ++integer);
}
}
System.out.println(hashMap);
}
}
jdk9.0添加的優(yōu)化
1:of()方法只是Map,List偎血,Set這三個接口的靜態(tài)方法诸衔,其父類接口和子類實(shí)現(xiàn)并沒有這類方法。比如 HashSet颇玷,ArrayList等笨农;
2:返回的集合是不可變的.
public class Demo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ghi");
System.out.println(list); //[abc, def, ghi]
}
}
package hashMap_demo;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author lx
* @date 2019/1/13 - 18:09
*/
public class HelloJDK9 {
public static void main(String[] args) {
// of方法設(shè)置后,集合不可變
Set<String> str1 = Set.of("a", "b", "c");
// str1.add("c"); 這里編譯的時候不會錯帖渠,但是執(zhí)行的時候會報錯谒亦,因?yàn)槭遣豢勺兊募? System.out.println(str1);//[a, c, b]
Map<String, Integer> str2 = Map.of("a", 1, "b", 2);
System.out.println(str2);//{a=1, b=2}
List<String> str3 = List.of("a", "b");
System.out.println(str3);//[a, b]
}
}
模擬斗地主洗牌發(fā)牌
- 使用面向?qū)ο蟮姆绞綄?shí)現(xiàn)斗地主洗牌發(fā)牌的操作
package douDiZhu;
import java.security.Key;
import java.util.*;
/**
* @author lx
* @date 2019/1/13 - 18:24
*
* 創(chuàng)建三個玩家
*
* 創(chuàng)建牌
* 構(gòu)造牌盒
* 洗牌
* 發(fā)牌
* 看牌
*
*/
public class DouDiZhu {
public static void main(String[] args) {
//創(chuàng)建牌數(shù)組
String [] as={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 創(chuàng)建花色
String [] poker_color={"?","?","?","?"};
//創(chuàng)建牌盒
Map<Integer,String> map=new LinkedHashMap<>();
//初始化索引為1
int count=1;
for (int i = 0; i <as.length; i++) {
for (int j = 0; j <poker_color.length; j++) {
//將牌的數(shù)字和花色組合遍歷
String sm=as[i]+poker_color[j];
//索引自增
map.put(count++,sm);
}
}
//添加大王小王牌面
map.put(count++,"小王??");
map.put(count++,"大王??");
//將map集合對象的鍵存放在set集合中
Set<Integer> set=map.keySet();
//創(chuàng)建ArrayList集合
ArrayList<Integer> arrayList=new ArrayList<>();
//將set集合元素全部存入ArrayList集合中
arrayList.addAll(set);
//洗牌
Collections.shuffle(arrayList);
// 發(fā)牌
// 創(chuàng)建三個玩家和三張底牌的索引
ArrayList<Integer> Wanjia1=new ArrayList<>();
ArrayList<Integer> wanjia2=new ArrayList<>();
ArrayList<Integer> wanjia3=new ArrayList<>();
ArrayList<Integer> dipaiNo=new ArrayList<>();
//給每個玩家發(fā)牌
for (int i = 0; i <arrayList.size() ; i++) {
Integer integer=arrayList.get(i);
if (i>=51) {
dipaiNo.add(integer);
} else{
if (i%3==0){
Wanjia1.add(integer);
} else if (i%3==1) {
wanjia2.add(integer);
}else {
wanjia3.add(integer);
}}
}
//將手中的牌按照大小排序
Collections.sort(Wanjia1);
Collections.sort(wanjia2);
Collections.sort(wanjia3);
Collections.sort(dipaiNo);
//創(chuàng)建玩家的牌面集合
ArrayList play1=new ArrayList();
ArrayList play2=new ArrayList();
ArrayList play3=new ArrayList();
ArrayList dipai=new ArrayList();
//遍歷 根據(jù)鍵來獲得值(牌面)
for (Integer is:Wanjia1) {
String value = map.get(is);
play1.add(value);
} for (Integer is:wanjia2) {
String value = map.get(is);
play2.add(value);
} for (Integer is:wanjia3) {
String value = map.get(is);
play3.add(value);
}for (Integer is:dipaiNo) {
String value = map.get(is);
dipai.add(value);
}
//看牌
System.out.println("哈兒"+play1);
System.out.println("逗逼" +play2);
System.out.println("傻子"+play3);
System.out.println("底牌"+dipai);
}
}