Java:map集合,字符出現(xiàn)次數(shù),ArrayList中嵌套HashMap等遍歷,斗地主,分牌





// 1."一閃一閃亮晶晶,滿(mǎn)天都是小星星",使用map集合計(jì)算每個(gè)字符出現(xiàn)了多少次
package a;
import java.util.HashMap;
import java.util.Set;
public class lizi {
public static void main(String[] args) {
String zijidingyidezifuchuan = "一閃一閃亮晶晶,滿(mǎn)天都是小星星";
HashMap<Object, Integer> HashMapduixiang1 = new HashMap<Object, Integer>();
for (int i = 0; i < zijidingyidezifuchuan.length(); i++) {
if (HashMapduixiang1.containsKey(zijidingyidezifuchuan.charAt(i))) {

int value = HashMapduixiang1.get(zijidingyidezifuchuan.charAt(i));
value += 1;
HashMapduixiang1.put(zijidingyidezifuchuan.charAt(i), value);
} else {
HashMapduixiang1.put(zijidingyidezifuchuan.charAt(i), 1);
}
}
Set<Object> set = HashMapduixiang1.keySet();
for (Object o : set) {
System.out.println("字符" + o + "出現(xiàn)了 " + HashMapduixiang1.get(o) + "次");
}
}
}



// 2.聲明ArrayList中嵌套HashMap,遍歷出來(lái)
package a;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class lizi {
public static void main(String[] args) {
HashMap<Integer, String> HashMapduixiang1 = new HashMap<Integer, String>();
HashMapduixiang1.put(1, " 1詩(shī)書(shū)");
HashMapduixiang1.put(2, "2畫(huà)唱");
HashMapduixiang1.put(3, "3歌手");
HashMapduixiang1.put(4, "4舞者");
HashMap<Integer, String> HashMapduixiang2 = new HashMap<Integer, String>();
HashMapduixiang2.put(11, "11up主");
HashMapduixiang2.put(22, "22作家");
HashMapduixiang2.put(33, "33最強(qiáng)最好機(jī)器人的制作者");
HashMapduixiang2.put(44, "44作曲人");
HashMap<Integer, String> HashMapduixiang3 = new HashMap<Integer, String>();
HashMapduixiang3.put(111, "111作詞人");
HashMapduixiang3.put(222, "222CEO");
HashMapduixiang3.put(333, "333董事長(zhǎng)");
HashMapduixiang3.put(444, "444偉人");
ArrayList<HashMap<Integer, String>> ArrayListHashMapduixiang1 =?
new ArrayList<HashMap<Integer, String>>();
ArrayListHashMapduixiang1.add(HashMapduixiang1);
ArrayListHashMapduixiang1.add(HashMapduixiang2);
ArrayListHashMapduixiang1.add(HashMapduixiang3);
for (int ALHMxiabiao = 0; ALHMxiabiao < ArrayListHashMapduixiang1.size(); ALHMxiabiao++) {
HashMap<Integer, String> HashMapduixiang4 = ArrayListHashMapduixiang1
.get(ALHMxiabiao);
Set<Integer> HashMapduixiang4_zhongdekey = HashMapduixiang4
.keySet();
for (Integer HMxiabiao : HashMapduixiang4_zhongdekey) {
System.out.print("第" + (ALHMxiabiao + 1) + "個(gè)hashmap的內(nèi)容為"
+ HashMapduixiang4.get(HMxiabiao) + "\t");
}
System.out.println();
}
}
}












3.聲明學(xué)生類(lèi)和HashMap,使用HashMap存儲(chǔ)學(xué)生類(lèi),使用2種遍歷方式遍歷出學(xué)生信息
方法一:
package a;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class lizi {
public static void main(String[] args) {
HashMap<student, String> HSduixiang = new HashMap<student, String>();
HSduixiang.put(new student("詩(shī)書(shū)", 22), "點(diǎn)贊省");
HSduixiang.put(new student("畫(huà)唱", 25), "投幣省");
HSduixiang.put(new student("帥哥", 24), "項(xiàng)省");
HSduixiang.put(new student("偉人", 26), "河省");
HSduixiang.put(new student("酷哥", 24), "江省");
System.out.println("第一種取出方式 ketSet:");
Set<student> keySet = HSduixiang.keySet();
Iterator<student> tiquchudeKey1 = keySet.iterator();
while (tiquchudeKey1.hasNext()) {
student Student_name_age1 = tiquchudeKey1.next();
String addr = HSduixiang.get(Student_name_age1);
System.out.println(Student_name_age1 + "---" + addr);
}
System.out
.println("HSduixiang.get(Student_name_age)中的Student_name_age這里充當(dāng)了Key,\n"
+ "就像引索,用關(guān)鍵詞搜索出要相關(guān)的內(nèi)容一樣,這里的相關(guān)內(nèi)容是地址addr");
System.out.println();
System.out.println("第二種取出方式entrySet:");
Set<Map.Entry<student, String>> entrySet = HSduixiang.entrySet();
Iterator<Map.Entry<student, String>> tiquchudeKey2 = entrySet
.iterator();
while (tiquchudeKey2.hasNext()) {
Map.Entry<student, String> yongMEdedaodeshujv = tiquchudeKey2
.next();
student Student_name_age2 = yongMEdedaodeshujv.getKey();
String addr = yongMEdedaodeshujv.getValue();
System.out.println(Student_name_age2 + "=====" + addr);
}
}
}
class student {
private int age;
private String name;
student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name + ":" + age;
}
}






方法二詳析:
/*
?每一個(gè)學(xué)生都有對(duì)應(yīng)歸屬地。
?學(xué)生Student 地址 String。
?學(xué)生屬性:姓名,年齡。
?注意:姓名和年齡相同的視為同一個(gè)學(xué)生。
?保證學(xué)生的唯一性。
?步驟:
?1、描述學(xué)生。
?2、定義map容器,將學(xué)生作為鍵,地址作為值,存入。
?3、獲取map集合中的元素。
?*/
package a;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class lizi {
public static void main(String[] args) {
HashMap<class_Student, String> HSduixiang = new HashMap<class_Student, String>();
HSduixiang.put(new class_Student("張三", 22), "北京");
HSduixiang.put(new class_Student("李四", 25), "上海");
HSduixiang.put(new class_Student("王五", 24), "香港");
HSduixiang.put(new class_Student("小張", 24), "煙臺(tái)");
HSduixiang.put(new class_Student("小李", 26), "濟(jì)南");
System.out.println("第一種取出方式 ketSet:");
Set<class_Student> keySet = HSduixiang.keySet();
Iterator<class_Student> tiquchudeKey1 = keySet.iterator();
while (tiquchudeKey1.hasNext()) {
class_Student Student_name_age1 = tiquchudeKey1.next();
String addr = HSduixiang.get(Student_name_age1);
System.out.println(Student_name_age1 + "---" + addr);
}
System.out
.println("HSduixiang.get(Student_name_age)中的Student_name_age這里充當(dāng)了Key,\n"
+ "就像引索,用關(guān)鍵詞搜索出要相關(guān)的內(nèi)容一樣,這里的相關(guān)內(nèi)容是地址addr");
System.out.println();
System.out.println("第二種取出方式entrySet:");
Set<Map.Entry<class_Student, String>> entrySet = HSduixiang.entrySet();
Iterator<Map.Entry<class_Student, String>> tiquchudeKey2 = entrySet.iterator();
while (tiquchudeKey2.hasNext()) {
Map.Entry<class_Student, String> yongMEdedaodeshujv = tiquchudeKey2.next();
class_Student Student_name_age2 = yongMEdedaodeshujv.getKey();
String addr = yongMEdedaodeshujv.getValue();
System.out.println(Student_name_age2 + "=====" + addr);
}
}
}
class class_Student implements Comparable<class_Student> {
private int age;
private String name;
class_Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(class_Student s) {
// TODO 自動(dòng)生成的方法存根:
int num = new Integer(this.age).compareTo(new Integer(s.age));
if (num == 0)
return this.name.compareTo(s.name);
return num;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof class_Student))
throw new ClassCastException("類(lèi)型不匹配");
class_Student s = (class_Student) obj;
return this.name.equals(s.name) && this.age == age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
// 保證鍵的唯一性:
@Override
public int hashCode() {
return name.hashCode() + age * 34;
}
@Override
public String toString() {
return name + ":" + age;
}
}






4.一副牌是54張,三個(gè)人斗地主,進(jìn)行分牌,分給每個(gè)人牌,并且還有有底牌
方法三(共4種方法,我在另一篇專(zhuān)欄寫(xiě)過(guò)了):
package a;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
public class lizi {
public static void main(String[] args) {
String[] Stringchucundepai = new String[] { "?A", "?2", "?3", "?4",
"?5", "?6", "?7", "?8", "?9", "?10", "?J", "?Q", "?K", "?A",
"?2", "?3", "?4", "?5", "?6", "?7", "?8", "?9", "?10", "?J",
"?Q", "?K", "?A", "?2", "?3", "?4", "?5", "?6", "?7", "?8",
"?9", "?10", "?J", "?Q", "?K", "?A", "?2", "?3", "?4", "?5",
"?6", "?7", "?8", "?9", "?10", "?J", "?Q", "?K" };
HashMap<String, Integer> HSchucundejiadepai = new HashMap<>();
HashMap<String, Integer> HSchucundeyidepai = new HashMap<>();
HashMap<String, Integer> HSchucundebingdepai = new HashMap<>();
ArrayList<String> yongALchucundeshuju = new ArrayList<String>();
for (int i = 0; i < Stringchucundepai.length; i++) {
yongALchucundeshuju.add(Stringchucundepai[i]);
}
yongALchucundeshuju.add("大王");
yongALchucundeshuju.add("小王");
Random suijishu = new Random();
String fangzidawangxiaowangchongfu = null;
for (int k = 0; k < 100; k++) {
int zongpaishu = yongALchucundeshuju.size();
int yongRandomdedaodesuijishu1 = suijishu.nextInt(zongpaishu);
int yongRandomdedaodesuijishu2 = suijishu.nextInt(zongpaishu);
if (yongRandomdedaodesuijishu1 == yongRandomdedaodesuijishu2)
continue;
{
fangzidawangxiaowangchongfu = yongALchucundeshuju
.get(yongRandomdedaodesuijishu1);
yongALchucundeshuju.set(yongRandomdedaodesuijishu1,
yongALchucundeshuju.get(yongRandomdedaodesuijishu2));
yongALchucundeshuju.set(yongRandomdedaodesuijishu2,
fangzidawangxiaowangchongfu);
}
}
ArrayList<String> yongALchucundejiadepai = new ArrayList<String>();
ArrayList<String> yongALchucundeyidedepai = new ArrayList<String>();
ArrayList<String> yongALchucundebingdepai = new ArrayList<String>();
ArrayList<String> yongALchucundedipai = new ArrayList<String>();
for (int i = 0; i < yongALchucundeshuju.size(); i++) {
if (i >= yongALchucundeshuju.size() - 3) {
yongALchucundedipai.add(yongALchucundeshuju.get(i));
} else if (i % 3 == 0) {
yongALchucundejiadepai.add(yongALchucundeshuju.get(i));
} else if (i % 3 == 1) {
yongALchucundeyidedepai.add(yongALchucundeshuju.get(i));
} else if (i % 3 == 2) {
yongALchucundebingdepai.add(yongALchucundeshuju.get(i));
}
}
System.out.println("底牌:" + yongALchucundedipai);
System.out.println("甲被發(fā)到的牌:" + yongALchucundejiadepai);
System.out.println("乙被發(fā)到的牌:" + yongALchucundeyidedepai);
System.out.println("丙被發(fā)到的牌:" + yongALchucundebingdepai);
}
}





方法詳析:
package a;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
public class lizi {
public static void main(String[] args) {
String[] Stringchucundepai = new String[] { "A", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "J", "Q", "K" };
HashMap<String, Integer> HSchucundejiadepai = new HashMap<>();
HashMap<String, Integer> HSchucundeyidepai = new HashMap<>();
HashMap<String, Integer> HSchucundebingdepai = new HashMap<>();
/*HashMap無(wú)序儲(chǔ)存,所以可以隨機(jī),概率相等且公平
* 個(gè)人理解:HSchucundejiadepai是用HashMap儲(chǔ)存的甲的牌<String, Integer>為泛型的應(yīng)用,
* 表明只儲(chǔ)存String和Integer類(lèi)型的數(shù)據(jù)
*/
ArrayList<String> yongALchucundeshuju = new ArrayList<String>();
/*
* 個(gè)人理解:這里的<String>為泛型,是規(guī)定集合可儲(chǔ)存范圍條件的,
* ArrayList<String>表明只儲(chǔ)存String到ArrayList里面
*/
for (int i = 0; i < Stringchucundepai.length; i++) {
/* Stringchucundepai.length=13 */
yongALchucundeshuju.add(Stringchucundepai[i]);
yongALchucundeshuju.add(Stringchucundepai[i]);
yongALchucundeshuju.add(Stringchucundepai[i]);
yongALchucundeshuju.add(Stringchucundepai[i]);
/*
* 用add和for循環(huán),在"(用ArrayList儲(chǔ)存的String數(shù)據(jù))yongALchucundeshuju"中添加了
* 4個(gè)"Stringchucundepai[0]("A")到Stringchucundepai[12]("K")",13*4=52
*/
}
yongALchucundeshuju.add("大王");
yongALchucundeshuju.add("小王");
/*
* 用add在"(用ArrayList儲(chǔ)存的String數(shù)據(jù))yongALchucundeshuju"中添加了
* "大王","小王",13*4+2=54
*/
Random suijishu = new Random();
/* suijishu為用Random得到的隨機(jī)數(shù) */
String fangzidawangxiaowangchongfu = null;/*
* fangzidawangxiaowangchongfu是防止
* "大王"
* "小王"等重復(fù)的,這種先在for外面設(shè)null的方法可常用于防重復(fù)
*/
for (int k = 0; k < 100; k++) {
int zongpaishu = yongALchucundeshuju.size();
/* yongALchucundeshuju.size()=13*4+2=54,zongpaishu為總牌數(shù) */
int yongRandomdedaodesuijishu1 = suijishu.nextInt(zongpaishu);
/*
* suijishu為隨機(jī)數(shù), nextInt用于規(guī)定隨機(jī)數(shù)suijishu可取值得范圍,這里是zongpaishu,即54。
* nextInt(54)等同于nextInt(54)+0,就是0到54(含頭不含尾),即為0到53(含頭含尾)
* “yongRandomdedaodesuijishu1”是“用Random得到的隨機(jī)數(shù)1”
*/
int yongRandomdedaodesuijishu2 = suijishu.nextInt(zongpaishu);
if (yongRandomdedaodesuijishu1 == yongRandomdedaodesuijishu2)
continue;/*
* 這里continue表明當(dāng)用Random得到的隨機(jī)數(shù)1=用Random得到的隨機(jī)數(shù)2時(shí),
* 跳過(guò)當(dāng)次循環(huán)中剩下的語(yǔ)句,執(zhí)行下一次循環(huán)(即不執(zhí)行且不出現(xiàn)“用Random得到的隨機(jī)數(shù)1=
* 用Random得到的隨機(jī)數(shù)2”的情況, 其他的{}中的語(yǔ)句會(huì)執(zhí)行 ,
*/
/*
* continue和break有點(diǎn)類(lèi)似,區(qū)別在于continue只是終止本次循環(huán),接著還執(zhí)行后面的循環(huán),break則完全終止循環(huán)。
*
* 可以理解為continue是跳過(guò)當(dāng)次循環(huán)中剩下的語(yǔ)句,執(zhí)行下一次循環(huán)。
*/
{
fangzidawangxiaowangchongfu = yongALchucundeshuju
.get(yongRandomdedaodesuijishu1);
/* 這里有一個(gè)賦值的過(guò)程,就像進(jìn)行兩個(gè)變量a和b,用c進(jìn)行交換a和b的值,防止a,b在賦值時(shí)相等
* 不信,可以把fangzidawangxiaowangchongfu改為yongALchucundeshuju
.get(yongRandomdedaodesuijishu1),保證會(huì)重復(fù) */
yongALchucundeshuju.set(yongRandomdedaodesuijishu1,
yongALchucundeshuju.get(yongRandomdedaodesuijishu2));
yongALchucundeshuju.set(yongRandomdedaodesuijishu2,
fangzidawangxiaowangchongfu);
}/*
* 個(gè)人理解:set用于插入數(shù)據(jù),這里往yongALchucundeshuju中插入
* yongRandomdedaodesuijishu1(int類(lèi)型),
* yongALchucundeshuju.get(yongRandomdedaodesuijishu2)
* (yongRandomdedaodesuijishu2這里為下標(biāo),含頭含尾的0到53)
* 等數(shù)據(jù),yongALchucundeshuju 儲(chǔ)存了得到的數(shù)據(jù),要用時(shí)就拿出來(lái)
*/
}
ArrayList<String> yongALchucundejiadepai = new ArrayList<String>();
ArrayList<String> yongALchucundeyidedepai = new ArrayList<String>();
ArrayList<String> yongALchucundebingdepai = new ArrayList<String>();
ArrayList<String> yongALchucundedipai = new ArrayList<String>();
for (int i = 0; i < yongALchucundeshuju.size(); i++) {
/* yongALchucundeshuju.size() =54 */
if (i >= yongALchucundeshuju.size() - 3) {
/* yongALchucundeshuju.size() - 3=54-3=52 */
yongALchucundedipai.add(yongALchucundeshuju.get(i));
/*
* yongALchucundedipai為用ArrayList儲(chǔ)存的底牌,i可為含頭含尾的0到53
* yongALchucundeshuju.get(i)就可為含頭含尾的4組“"A", "2", "3", "4", "5",
* "6", "7", "8", "9", "10", "J", "Q", "K"”和一組"大王","小王"
*/
} else if (i % 3 == 0) {
/*
* i % 3 == 0表明可被3整除余數(shù)為0, 在含頭含尾的下標(biāo)0到53中,出現(xiàn)i % 3 == 0和出現(xiàn)i % 3 ==
* 1和 出現(xiàn)i % 3 == 2的概率互相相同,“0,1,2”,“3,4,5”,......“51,52,53”
* 編程,電腦,大腦等就是“儲(chǔ)存和取出”
*/
yongALchucundejiadepai.add(yongALchucundeshuju.get(i));
} else if (i % 3 == 1) {
yongALchucundeyidedepai.add(yongALchucundeshuju.get(i));
} else if (i % 3 == 2) {
yongALchucundebingdepai.add(yongALchucundeshuju.get(i));
}
}
System.out.println("底牌:" + yongALchucundedipai);
System.out.println("甲被發(fā)到的牌:" + yongALchucundejiadepai);
System.out.println("乙被發(fā)到的牌:" + yongALchucundeyidedepai);
System.out.println("丙被發(fā)到的牌:" + yongALchucundebingdepai);
System.out.println("1代表?, 2代表?, 3代表?,4代表?");
for (String str : yongALchucundejiadepai) {
/* yongALchucundejiadepai用ArrayList儲(chǔ)存的甲的牌,有隨機(jī)個(gè)下標(biāo)值 */
if (HSchucundejiadepai.containsKey(str)) {
HSchucundejiadepai.put(str, HSchucundejiadepai.get(str) + 1);
} else
HSchucundejiadepai.put(str, 1);
}
System.out.println("甲被發(fā)到的牌對(duì)應(yīng)圖形情況:" + HSchucundejiadepai);
for (String str : yongALchucundeyidedepai) {
/* yongALchucundejiadepai用ArrayList儲(chǔ)存的乙的牌,有隨機(jī)個(gè)下標(biāo)值 */
if (HSchucundeyidepai.containsKey(str)) {
HSchucundeyidepai.put(str, HSchucundeyidepai.get(str) + 1);
} else
HSchucundeyidepai.put(str, 1);
}
System.out.println("乙被發(fā)到的牌對(duì)應(yīng)圖形情況:" + HSchucundeyidepai);
for (String str : yongALchucundebingdepai) {
/* yongALchucundejiadepai用ArrayList儲(chǔ)存的丙的牌,有隨機(jī)個(gè)下標(biāo)值 */
if (HSchucundebingdepai.containsKey(str)) {
HSchucundebingdepai.put(str, HSchucundebingdepai.get(str) + 1);
} else
HSchucundebingdepai.put(str, 1);
}
System.out.println("丙被發(fā)到的牌對(duì)應(yīng)圖形情況:" + HSchucundebingdepai);
}
}