ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JAV练习题(Map双列集合)

2022-01-26 22:31:53  阅读:142  来源: 互联网

标签:练习题 map hash 数组 Map JAV 链表 key put


1.利用Map,完成下面的功能:
从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。
历届世界杯冠军
届数 举办年份 冠军
第一届 1930年 乌拉圭
第二届 1934年 意大利
第三届 1938年 意大利
第四届 1950年 乌拉圭
第五届 1954年 西德
第六届 1958年 巴西
第七届 1962年 巴西
第八届 1966年 英格兰
第九届 1970年 巴西
第十届 1974年 西德
第十一届 1978年 阿根廷
第十二届 1982年 意大利
第十三届 1986年 阿根廷
第十四届 1990年 西德
第十五届 1994年 巴西
第十六届 1998年 法国
第十七届 2002年 巴西
第十八届 2006年 意大利
第十九届 2010年 西班牙
第二十届 2014年 德国
第二十一届 2018年 法国

在原有世界杯Map 的基础上,增加如下功能:
在这里插入图片描述

package com.ffyc.javaoop.day12.HM;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Demo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<String,String> map = new HashMap<>();
        map.put("1930", "乌拉圭");
        map.put("1934", "意大利");
        map.put("1938", "意大利");
        map.put("1950", "乌拉圭");
        map.put("1954", "西德");
        map.put("1958", "巴西");
        map.put("1962", "巴西");
        map.put("1966", "英格兰");
        map.put("1970", "巴西");
        map.put("1974", "西德");
        map.put("1978", "阿根廷");
        map.put("1982", "意大利");
        map.put("1986", "阿根廷");
        map.put("1990", "西德");
        map.put("1994", "巴西");
        map.put("1998", "法国");
        map.put("2002", "巴西");
        map.put("2006", "意大利");
        map.put("2010", "西班牙");
        map.put("2014", "德国");
        map.put("2018", "法国");
        System.out.println("输入一个年份");
        String year = scanner.next();
        if(map.containsKey(year)) {
            System.out.println("该年夺得世界杯的是" + map.get(year));
        }
        if (map.containsKey(year)==false){
            System.out.println("该年没有举办世界杯");
        }
        System.out.println("输入一个国家查看获得大力神杯的年份");
        String country = scanner.next();
        Set<Map.Entry<String,String>> entries = map.entrySet();
        for(Map.Entry<String,String>entry:entries){
            if((entry.getValue()).equals(country)){
                System.out.println(entry.getKey());
            }
        }
    }
}

2.有这样一个字符串"babcabcdaebcdeaa", 统计字符串中每一个字母出现的次数.
要求结果:{a=5,b=4,c=3,d=2,e=2} 要考虑字符串内容是可变的

package com.ffyc.javaoop.day12.HM;

import java.util.Map;
import java.util.TreeMap;

/*
2.有这样一个字符串"babcabcdaebcdeaa", 统计字符串中每一个字母出现的次数.
要求结果:{a=5,b=4,c=3,d=2,e=2}  要考虑字符串内容是可变的
 */
public class Demo2 {
    public static void main(String[] args) {
        String s = "babcabcdaebcdeaa";
        char[] ch = s.toCharArray();
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        for (int i = 0; i < ch.length; i++) {

            if(ch[i]=='a'){
                a++;
            }else if(ch[i]=='b'){
                b++;
            }else if(ch[i]=='c'){
                c++;
            }else if(ch[i]=='d'){
                d++;
            }else if(ch[i]=='e'){
                e++;
            }
        }
        Map<String,Integer> map = new TreeMap<>();
        map.put("a", a);
        map.put("b", b);
        map.put("c", c);
        map.put("d", d);
        map.put("e", e);
        System.out.println(map);
    }


}

3.有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省],第二个数组为:[哈尔滨,杭州,南昌,广州,福州],将第一个数组元素作为key,第二个数组元素作为value存储到Map集合中。如{黑龙江省=哈尔滨, 浙江省=杭州, …}。

package com.ffyc.javaoop.day12.HM;

import java.util.Map;
import java.util.TreeMap;

/*
3.有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省],
第二个数组为:[哈尔滨,杭州,南昌,广州,福州],
将第一个数组元素作为key,第二个数组元素作为value存储到Map集合中。
如{黑龙江省=哈尔滨, 浙江省=杭州, …}。
 */
public class Demo3 {
    public static void main(String[] args) {
        String[] s1 = {"黑龙江省","浙江省","江西省","广东省","福建省"};
        String[] s2 = {"哈尔滨","杭州","南昌","广州","福州"};
        Map<String,String> map = new TreeMap<>();
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if(i==j){
                    map.put(s1[i],s2[j]);
                }
            }

        }
        System.out.println(map);
    }
}

4.简答
画图整理集合章节中的体系结构图,说明每个接口的作用,每个实现类的特点.
在这里插入图片描述
在这里插入图片描述

说一说ArrayList添加元素的过程及扩容机制?
答:在底层创建一个默认长度数组,当数组内容添加满了之后,会扩容一个新数组,长度为原来的1.5倍
ArrayList和LinkedList的区别及使用场景?
ArrayList基于数组实现,初始化时,默认长度为10,线程不安全,查询快,增删慢
适用于对各个索引位置的元素进行大量的存取或删除
LinkedList基于双链表实现,查询慢,增删快。
适用于对列表进行循环,循环时进行插入或删除
说一下HashMap的底层实现原理?
答:有一个每个元素都是链表的数组,当添加一个元素时,首先计算元素的hash值,来确定插入的位置,如果存在同一hash值的元素已经被放在这个位置,就添加到后面,形成链表,同一链表的hash值是相同的,当链表长度太大时,链表就转换为红黑树。当链表数组的容量超过初始容量的0.75时,散列将数组扩大两倍,把原链表搬到新链表数组中
以下源码可供参考

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        //Node类型的数组(哈希表)             节点
        HashMap.Node<K,V>[] tab; HashMap.Node<K,V> p; int n(哈希表长度), i(就是哈希数组的索引);
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;//resize()方法就用来扩容hash表
             //16-1 & hash (a=97) == 97%16 计算=元素在哈希表中的位置
        if ((p = tab[i = (n - 1) & hash]) == null) //当哈希表中的第一个位置没有值,直接将数据包装在Node节点中
            tab[i] = newNode(hash, key, value, null); //放在第一个位置中
        else {
            // e记录重复key
            HashMap.Node<K,V> e; K k;
            //判断hash值有没有重复的
            if (p.hash == hash &&                            哈希值相等,调用equals()
                    ((k = p.key) == key || (key != null && key.equals(k))))
                e = p; //如果哈希值相等, equals结果也相等,那么就是重复元素
            else if (p instanceof TreeNode)//判断是否已经转为红黑树, 已经转了,将元素添加到红黑树中
                e = ((HashMap.TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {//还是链表
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);//把元素添到链表中
                        if (binCount >= TREEIFY_THRESHOLD - 1) //当链表长度为8时,触发转红黑树机制
                            treeifyBin(tab, hash);//链表转红黑树, 当哈希长度>64&&链表长度>=8 真正的转红黑树
                        break;
                    }
                    if (e.hash == hash &&
                            ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value; //用后来相同键的值,将原来键的值替换掉
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

标签:练习题,map,hash,数组,Map,JAV,链表,key,put
来源: https://blog.csdn.net/qq_44125413/article/details/122708960

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有