Map集合及遍历 debug用法 以及集合的斗地主应用练习
第一个独立应用:斗地主,分步骤一点点把项目拆分每一步去完成。
01_第一章:回顾_三种集合的存储方式:
02_第一章:Map集合_常用方法:
1).Map集合的特点:
1).双列集合–键值对存储;
2).键不能重复–值可以重复;
2).Map的两个子类:
Map的数据结构全部应用在“键”上,值不适用数据结构。
1).HashMap:“键”是哈希表结构;无序的;
2).LinkedHashMap:“键”是链表 + 哈希表结构。有序的。
3).Map的常用方法:
K:key(键)
V:value(值)
1).增、改:
public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
2).删除:
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,
返回被删除元素的值。
3).查询:
1).public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
4).对Map的遍历:Map不能直接遍历。
1).键找值:
public class Demo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("美女","杨幂");
map.put("光头", "徐峥");
map.put("贵妇","黄渤");
//遍历方式一:键找值
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key + "," + map.get(key));
}
}
}
2).获取键值对对象:
public class Demo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("美女","杨幂");
map.put("光头", "徐峥");
map.put("贵妇","黄渤");
//遍历方式二:取出所有的键值对对象
Set<Map.Entry<String,String>> es = map.entrySet();
for (Map.Entry<String, String> e : es) {
String key = e.getKey();
String value = e.getValue();
System.out.println(key + "," + value);
}
}
}
3).两种遍历方式的对比:
03.第一章:Map集合_使用自定义对象做键:
1).自定义对象做键:重写hashCode()和equals()方法;
2).示例代码:
1).Student类:
public class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
2).测试类:
public class Demo {
public static void main(String[] args) {
Map<Student,String> map = new HashMap<>();
map.put(new Student("徐峥",17), "北京顺义");
map.put(new Student("黄渤",18),"青岛黑马");
map.put(new Student("黄渤",18),"上海黑马");//重写hashCode和equals后,验证成功
//1.键找值
Set<Student> keys = map.keySet();
for (Student stu : keys) {
System.out.println(stu + "|" + map.get(stu));
}
System.out.println("-----------------------------------------");
//2.键值对
Set<Map.Entry<Student,String>> es = map.entrySet();
for (Map.Entry<Student, String> e : es) {
Student key = e.getKey();
String value = e.getValue();
System.out.println(key + "%" + value);
}
}
}
04.第一章:Map集合_LinkedHashMap:
1).特点:“键”的数据结构:链表 + 哈希表 ,有序的;
2).特点:
public class Demo {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("美女", "杨幂");
map.put("帅哥", "胡瑞");
map.put("光头", "徐峥");
map.put("贵妇", "黄渤");
//1.键找值
Set<String> keys = map.keySet();
for (String k : keys) {
System.out.println(k + "," + map.get(k));
}
}
}
05.第一章:Map集合_练习:
1).计算一个字符串中每个字符出现次数:
2).算法分析:
3).示例代码:
public class Demo {
public static void main(String[] args) {
//计算一个字符串中每个字符出现次数
String str = "jfjfuduiomflvmczkaavmfsbvajfk";
//步骤:
//1.定义Map集合,存储结果
Map<Character, Integer> map = new HashMap<>();
//2.遍历字符串,取出每个字符
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
//3.用这个字符做“键",到集合中找:值
Integer value = map.get(c);
if(value == null){
// 没找到:put(字符,1)
map.put(c, 1);
}else{// 找到:put(字符,值 + 1);
map.put(c,value + 1);
}
}
//4.循环结束
//5.验证,遍历Map
Set<Character> keys = map.keySet();
for (Character c : keys) {
System.out.println(c + " = " + map.get(c));
}
}
}
06.怎样选择集合:
1).单列:
有序:常用:ArrayList
.经常查询,很少增、删:ArrayList
经常增删:LinkedList
2).无序:常用:HashSet
双列:当需要存储少数的几种对象,并希望通过一个名字来获取某个对象时 HashMap
07.第二章:可变参数:
1).当我们的方法中需要某种类的多个参数时,可以定义为:可变参数:
2).例如:
public class Demo {
public static void main(String[] args) {
int a1 = sum();//编译后:int a1 = sum(new int[0]);
int a2 = sum(2,3,24,3242,2432,5,44,1,42,51,4);//编译后:sum(new int[]{2,3,24,3242,2432,5,44,1,42,51,4});
int[] arr = {1,43,24,32,542};
int a3 = sum(arr);
}
public static int sum(int ... a) {//sum(int[] a)
int s = 0;
for (int i = 0; i < a.length; i++) {
s = s + a[i];
}
return s;
}
}
3).其他说明:
1).在一个方法的形参列表中最多只能有一个“可变参数”;而且可变参数必须要位于“形参列表”的末尾。
public class Demo {
public static void main(String[] args) {
fun("黄渤",1.7);
fun("黄渤",1.7,14324,32,432,43,25,324,32,542,432,542,43,24,32);
int[] arr2 = {1,2,43,24};
fun("黄渤",1.7,arr2);
}
public static void fun(String s,double d,int ... arr){
//....
}
}
2).可变参数可以是“任何类型”
08.第二章:Debug调试:
1).在需要断点的代码位置左侧,鼠标单击,出现一个小红点:
2).在代码视图,右键,Debug运行:
3).运行后,IDEA会在断点处暂停代码的执行,等待我们的指令:
4):单步执行:
F8:单步执行,如果语遇到方法调用,不会进入方法体,直接将方法执行完毕。
或者: F7:单步执行,如果遇到方法调用,会进入方法体。
F9:结束单步执行,会继续运行后续的代码直到遇到下一个断点,或者程序结束。
09.第三章:综合案例_斗地主洗牌发牌:
1).分析:
1).封装一副牌–Map
2).创建一个存储编号的集合
3).洗牌–洗编号
4).发牌–发编号
5).看牌–用编号到Map中将对应的牌面找出
2).对牌排序的算法:
========================================================================
学习目标总结:
01.能够说出Map集合特点
1).双列集合–键值对存储;
2)."键"不能重复;值可以重复;
02.使用Map集合添加方法保存数据
Map<String,String> map = new HashMap<>();
map.put("美女","杨幂");
...
03.使用”键找值”的方式遍历Map集合
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println(k + "," + map.get(k));
}
04.使用”键值对”的方式遍历Map集合
Set<Map.Entry<String,String>> es = map.entrySet();
for(Map.Entry<String,String> e : es){
String key = e.getKey();
String value = e.getValue();
....
}
05.能够使用HashMap存储自定义键值对的数据
1).自定义对象做键:要重写hashCode()和equals()
2).
public static void main(String[] args) {
Map<Student,String> map = new HashMap<>();
map.put(new Student("徐峥",17), "北京顺义");
map.put(new Student("黄渤",18),"青岛黑马");
map.put(new Student("黄渤",18),"上海黑马");
//1.键找值
Set<Student> keys = map.keySet();
for (Student stu : keys) {
System.out.println(stu + "|" + map.get(stu));
}
System.out.println("-----------------------------------------");
//2.键值对
Set<Map.Entry<Student,String>> es = map.entrySet();
for (Map.Entry<Student, String> e : es) {
Student key = e.getKey();
String value = e.getValue();
System.out.println(key + "%" + value);
}
}
06.能够使用可变参数
public static void show(int … nums){//编译后:show(int[] nums)
//nums就是一个数组
}
07.能够使用HashMap编写斗地主洗牌发牌案例
1).封装牌面
1).map
2).两个数组
3).索引变量;
4).开始封装
2).创建一个编号集合
3).洗牌–洗编号
4).发牌–发编号
5).看牌–将编号转换为Map中的牌面