码迷,mamicode.com
首页 > 编程语言 > 详细

我在乐字节学习的第六天(Java)

时间:2020-12-22 13:05:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:生活   回车   put   lse   array   时间   职业   b2c   ide   

今天是我在乐字节学习的第六天,俗话说得好:Java学的好,就业加薪来的早,哈哈,这也就是我个人经过这几天学习之后才发现,其实学习编程关键是要找到一种合适的语言,我也是刚刚入门,跟吴岳老师学习这几天下来效果还贼奈斯,老师说如果你将写代码作为自己的职业,哪就要珍惜自己的时间。我感觉自学效率和跟着老师学习果然很低。有吴岳老师的帮助太多效率高了,一起努力吧!兄弟萌!

今天老师讲的是map集合,map集合遍历,断点调试

一、MAP集合

1、现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
技术图片

  • Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
  • Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
  • Collection中的集合称为单列集合,Map中的集合称为双列集合。
  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
    2、Map常用子类
    HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
    LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
    3、Map接口中的常用方法
  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
  • boolean containsKey(Object key) 判断集合中是否包含指定的键。
  • public Set&lt;K&gt; keySet(): 获取Map集合中所有的键,存储到Set集合中。
  • public Set&lt;Map.Entry&lt;K,V&gt;&gt; entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
    4、Map集合遍历方式一(通过键找值的方式)
    键找值方式:即通过元素中的键,获取键所对应的值分析步骤:
    1)获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:keyset()
    2)遍历键的Set集合,得到每一个键。
    3)根据键,获取键所对应的值。方法提示:get(K key)
public class MapDemo01 {
    public static void main(String[] args) {
        //创建Map集合对象 
        HashMap<String, String> map = new HashMap<String,String>();
        //添加元素到集合 
        map.put("胡歌", "霍建华");
        map.put("郭德纲", "于谦");
        map.put("薛之谦", "大张伟");

        //获取所有的键  获取键集
        Set<String> keys = map.keySet();
        // 遍历键集 得到 每一个键
        for (String key : keys) {
            //key  就是键
            //获取对应值
            String value = map.get(key);
            System.out.println(key+"的CP是:"+value);
        }  
    }
}
1234567891011121314151617181920

技术图片
5、Map集合遍历方式二(键值对方式)
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。操作步骤与图解:
1)获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()
2)遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
3)通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()

public class MapDemo02 {
    public static void main(String[] args) {
        // 创建Map集合对象 
        HashMap<String, String> map = new HashMap<String,String>();
        // 添加元素到集合 
        map.put("胡歌", "霍建华");
        map.put("郭德纲", "于谦");
        map.put("薛之谦", "大张伟");

        // 获取 所有的 entry对象  entrySet
        Set<Entry<String,String>> entrySet = map.entrySet();

        // 遍历得到每一个entry对象
        for (Entry<String, String> entry : entrySet) {
            // 解析 
            String key = entry.getKey();
            String value = entry.getValue();  
            System.out.println(key+"的CP是:"+value);
        }
    }
}
123456789101112131415161718192021

技术图片
6、LinkedHashMap和Hashtable
我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序可以使用HashMap的子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢,存储null值和null键。
Hashmap:底层是一个哈希表,是一个线程不安全的集合,是多线程集合,速度快,不能存储null值和null键,和vector一样,在java1.2之后被更先进的集合被取代(Hashmap和Arraylist等。
Hashtable的子类properties依然活跃在历史舞台,该集合是唯一一个和IO流相结合的集合。
二、Deguge断点调试
使用IDEA的断点调试功能,查看程序的运行过程
1、在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序
技术图片
2、点击Debug运行模式
技术图片
3、程序停止在断点上不再执行,而IDEA最下方打开了Debug调试窗口
技术图片
4、Debug调试窗口介绍
技术图片5、快捷键F8,代码向下执行一行,第九行执行完毕,执行到第10行(第10行还未执行)
技术图片
6、切换到控制台面板,控制台显示 请录入一个字符串: 并且等待键盘录入
技术图片
7、快捷键F8,程序继续向后执行,执行键盘录入操作,在控制台录入数据 ababcea
技术图片
回车之后效果:
技术图片调试界面效果:
技术图片
8、 此时到达findChar方法,快捷键F7,进入方法findChar
技术图片
9、快捷键F8 接续执行,创建了map对象,变量区域显示
技术图片
10、快捷键F8 接续执行,进入到循环中,循环变量i为 0,F8再继续执行,就获取到变量c赋值为字符‘a’ 字节值97
技术图片
11、快捷键F8 接续执行,进入到判断语句中,因为该字符 不在Map集合键集中,再按F8执行,进入该判断中
技术图片
12、快捷键F8 接续执行,循环结束,进入下次循环,此时map中已经添加一对儿元素
技术图片
13、快捷键F8 接续执行,进入下次循环,再继续上面的操作,我们就可以看到代码每次是如何执行的了
技术图片
14、如果不想继续debug,那么可以使用快捷键F9,程序正常执行到结束,程序结果在控制台显示
技术图片
三、斗地主洗牌算法
按照斗地主的规则,完成洗牌发牌的动作。
技术图片
具体规则:
1、组装54张扑克牌将
2、54张牌顺序打乱
3、三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
4、查看三人各自手中的牌(按照牌的大小排序)、底牌

规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
技术图片
public class Poker {
public static void main(String[] args) {
/*

  • 1组装54张扑克牌
    */
    // 1.1 创建Map集合存储
    HashMap<Integer, String> pokerMap = new HashMap<Integer, String>();
    // 1.2 创建 花色集合 与 数字集合
    ArrayList<String> colors = new ArrayList<String>();
    ArrayList<String> numbers = new ArrayList<String>();
    // 1.3 存储 花色 与数字
    Collections.addAll(colors, "?", "?", "?", "?");
    Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
    // 设置 存储编号变量
    int count = 1;
    pokerMap.put(count++, "大王");
    pokerMap.put(count++, "小王");
    // 1.4 创建牌 存储到map集合中
    for (String number : numbers) {
        for (String color : colors) {
            String card = color + number;
            pokerMap.put(count++, card);
        }
    }
    /*
     * 2 将54张牌顺序打乱
     */
    // 取出编号 集合
    Set<Integer> numberSet = pokerMap.keySet();
    // 因为要将编号打乱顺序 所以 应该先进行转换到 list集合中
    ArrayList<Integer> numberList = new ArrayList<Integer>();
    numberList.addAll(numberSet);

    // 打乱顺序
    Collections.shuffle(numberList);

    // 3 完成三个玩家交替摸牌,每人17张牌,最后三张留作底牌
    // 3.1 发牌的编号
    // 创建三个玩家编号集合 和一个 底牌编号集合
    ArrayList<Integer> noP1 = new ArrayList<Integer>();
    ArrayList<Integer> noP2 = new ArrayList<Integer>();
    ArrayList<Integer> noP3 = new ArrayList<Integer>();
    ArrayList<Integer> dipaiNo = new ArrayList<Integer>();

    // 3.2发牌的编号
    for (int i = 0; i < numberList.size(); i++) {
        // 获取该编号
        Integer no = numberList.get(i);
        // 发牌
        // 留出底牌
        if (i >= 51) {
            dipaiNo.add(no);
        } else {
            if (i % 3 == 0) {
                noP1.add(no);
            } else if (i % 3 == 1) {
                noP2.add(no);
            } else {
                noP3.add(no);
            }
        }
    }

    // 4 查看三人各自手中的牌(按照牌的大小排序)、底牌
    // 4.1 对手中编号进行排序
    Collections.sort(noP1);
    Collections.sort(noP2);
    Collections.sort(noP3);
    Collections.sort(dipaiNo);

    // 4.2 进行牌面的转换
    // 创建三个玩家牌面集合 以及底牌牌面集合
    ArrayList<String> player1 = new ArrayList<String>();
    ArrayList<String> player2 = new ArrayList<String>();
    ArrayList<String> player3 = new ArrayList<String>();
    ArrayList<String> dipai = new ArrayList<String>();

    // 4.3转换
    for (Integer i : noP1) {
        // 4.4 根据编号找到 牌面 pokerMap
        String card = pokerMap.get(i);
        // 添加到对应的 牌面集合中
        player1.add(card);
    }

    for (Integer i : noP2) {
        String card = pokerMap.get(i);
        player2.add(card);
    }
    for (Integer i : noP3) {
        String card = pokerMap.get(i);
        player3.add(card);
    }
    for (Integer i : dipaiNo) {
        String card = pokerMap.get(i);
        dipai.add(card);
    }

    //4.5 查看
    System.out.println("令狐冲:"+player1);
    System.out.println("石破天:"+player2);
    System.out.println("鸠摩智:"+player3);
    System.out.println("底牌:"+dipai);
}

}

我在乐字节学习的第六天(Java)

标签:生活   回车   put   lse   array   时间   职业   b2c   ide   

原文地址:https://blog.51cto.com/15050544/2566060

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!