当前位置: 首页 > news >正文

java 集合进阶

双列集合

map

实例

package mymap;

import java.util.HashMap;
import java.util.Map;

public class MapDemo1 {
    public static void main(String[] args) {
        /*
        V put(K key,v value)添加元素
        V remove(object key)根据键删除键值对元素
        void clear()移除所有的键值对元素
        boolean containsKey(object key) 判断集合是否包含指定的键
        boolean containsValue(object value) 判断集合是否包含指定的值
        boolean isEmpty() 判断集合是否为空
        int size()集合的长度,也就是集合中键值对的个数
        */

        //1.创建一个Map集合对象
        Map<String,String> m=new HashMap<>();

        //2.添加元素
        //2.添加元素
        //put方法的细节:
        //添加/覆盖
        //在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中
        //在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
        m.put("1", "zhangsan");
        m.put("2", "lisi");
        m.put("3", "wangwu");

        //String v=m.put("3", "zhaoliu");
        //System.out.println(v);

        //删除
        //String result=m.remove("1");
        //System.out.println(result);

        //清空
        //m.clear();

        //判断是否包含
        //boolean keyResult=m.containsKey("1");
        //System.out.println(keyResult);

        //判断集合是否为空
        //boolean empty=m.isEmpty();
        //System.out.println(empty);

        //集合的长度
        int size=m.size();
        System.out.println(size);

        //3.打印集合对象
        System.out.println(m);

    }
}

Map的遍历方式

 1.键找值

package mymap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo2 {
    public static void main(String[] args) {
        //1.创建一个Map集合
        Map<String,String> map=new HashMap<>();

        //2.添加元素
        map.put("1","one");
        map.put("2","two");
        map.put("3","three");

        //3.1获取键的集合
        Set<String> keys=map.keySet();
        //3.2通过键获取值
        for(String key:keys){
            System.out.println(key);
            //3.3获取值
            String value=map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

用keySet()方法获取map中的键 

2.键值对

package mymap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo3 {
    public static void main(String[] args) {
        //Map集合的第二种遍历方式

        //1.创建Map集合的对象
       Map<String,String> map=new HashMap<>();
        //2.添加元素
        //键:人物的外号
        //值:人物的名字
        map.put("标枪选手","马超");
        map.put("人物挂件","明世隐");
        map.put("御龙骑士","尹志平");

        //3.Map集合的第二种遍历方式
        //通过键值对对象进行遍历
        //3.1 通过一个方法获取所有的键值对对会
        Set<Map.Entry<String,String>> entries=map.entrySet();
        //3.2 遍历entries这个集合,去得到里面的每一个键值对对象
        for (Map.Entry<String, String> entry : entries) {
            //3.3 利用entry调用get方法获取键和值
            String key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

 用entrySet()方法获取map中的键值对

3.Lambda表达式

package mymap;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

public class MapDemo4 {
    public static void main(String[] args) {
        //Map集合的第三种遍历方式

        //1.创建Map集合的对象
        Map<String,String> map=new HashMap<>();

        //2.添加元素
        //键:人物的名字
        //值:名人名言
        map.put("鲁迅","这句话是我说的");
        map.put("曹操","不可能绝对不可能");
        map.put("刘备","接着奏乐接着舞");
        map.put("柯镇恶","看我眼色行事");
        //3.利用1ambda表达式进行遍历
        //底层:
        //forEach其实就是利用第二种方式进行遍历,依次得到每一个键和值
        //再调用accept方法
        map.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String k, String v) {
                System.out.println(k+"="+v);
            }
        });
        map.forEach((k,v)->{
            System.out.println(k+"="+v);
        });
    }
}

HashMap

HsahMap练习

练习1

package mymap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapDemo1 {
    public static void main(String[] args) {
        /*
        需求:创建一个HashMap集合,
        键是学生对象(student),值是籍贯(string)
        存储三个键值对元素,并遍历
        要求:同姓名,同年龄认为是同一个学生
        */

        //1.创建HashMap集合对象
        HashMap<Student, String> map = new HashMap<>();

        //2.创建学生对象
        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);
        Student s4 = new Student("wangwu", 25);

        //3.添加键值对元素
        map.put(s1, "北京");
        map.put(s2, "上海");
        map.put(s3, "广州");
        map.put(s4, "深圳");

        //4.遍历集合
        Set<Student> keys = map.keySet();
        for(Student key:keys){
            String value = map.get(key);
            System.out.println(key+"="+value);
        }

        System.out.println("---------------");

        Set<Map.Entry<Student, String>> entries = map.entrySet();
        for(Map.Entry<Student, String> entry:entries){
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }

        System.out.println("---------------");

        map.forEach((student,s)-> System.out.println(student+"="+s));
    }
}

练习2

package mymap;

import java.util.*;

public class HashMapDemo2 {
    public static void main(String[] args) {
        /*
        某个班级80名学生,现在需要组成秋游活动,
        班长提供了四个景点依次是(A、8、C、D),
        每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多
         */

        //1.需要先让同学们投票
        //定义一个数组,数组的元素是学生的投票选项
        String[]arr={"A","B","C","D"};
        ArrayList<String> list = new ArrayList<>();
        Random r=new Random();
        //利用随机数,模拟80个同学的投票
        for (int i = 0; i < 80; i++) {
            //随机生成一个索引
            int index=r.nextInt(arr.length);
            list.add(arr[index]);
        }
        //2.如果要统计的东西比较多,不方便用计数器,此时我们可以选择Map集合
        //定义一个Map集合,用来统计最终的结果
        HashMap<String, Integer> map = new HashMap<>();

        for (String name : list) {
            if(map.containsKey(name)){
                //包含了,说明之前已经投过票了
                int count=map.get(name);
                count++;
                map.put(name,count);
            }else{
                //不包含,说明是第一次投票
                map.put(name,1);
            }
        }

        System.out.println(map);

        //3.求最大值
        int max=0;
        Set<Map.Entry<String,Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            int count=entry.getValue();
            if(count>max){
                max=count;
            }
        }

        //4.判断哪个景点的次数和最大值一样,如果一样,就输出
        for (Map.Entry<String, Integer> entry : entries) {
            int count=entry.getValue();
            if(count==max){
                System.out.println(entry.getKey());
            }
        }
    }
}

 

 LinkedHashMap

TreeMap

如果两种排序规则都书写了,以第二种为准

案例

 

需求1 

package mymap;

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMap1 {
    public static void main(String[] args) {
        /*
        TreeMap集合:基本应用
        需求1:
        键:整数表示id
        值:字符串表示商品名称
        要求1:按照id的升序排列
        要求2:按照id的降序排列
         */

        //1.创建TreeMap集合
        TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        //2.添加元素
        tm.put(1,"六个核弹");
        tm.put(2,"八个雅鹿");
        tm.put(3,"肯贝基");
        tm.put(4,"霸王堡");

        //3.打印集合
        System.out.println(tm);
    }
}

 需求2

package mytreemap;

public class Student implements Comparable<Student> {
    private String name;
    private int age;

    ......

    @Override
    public int compareTo(Student o) {
        int i = this.age - o.age;
        i=i==0?this.name.compareTo(o.name):i;
        return i;
    }
}
package mytreemap;

import myhashmap.Student;

import java.util.TreeMap;

public class TreeMap2 {
    public static void main(String[] args) {
        /*
        TreeMap集合:基本应用
        需求2:
        键:学生对象
        值:籍贯
        要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名年龄视为同一个人。
         */

        //1.创建TreeMap集合
        TreeMap<mytreemap.Student,String> tm = new TreeMap<>();
        //2.添加元素
        tm.put(new mytreemap.Student("zhangsan",20),"北京");
        tm.put(new mytreemap.Student("lisi",21),"上海");
        tm.put(new mytreemap.Student("wangwu",22),"广州");
        tm.put(new mytreemap.Student("zhaoliu",20),"深圳");

        //3.打印集合
        System.out.println(tm);
    }
}

案例

package mytreemap;

import java.util.TreeMap;

public class TreeMap3 {
    public static void main(String[] args) {
        /*
        需求:
           字符串“aababcabcdabcde”
           请统计字符串中每一个字符出现的次数,并按照以下格式输出
           输出结果:
           a(5)b(4)c(3)d(2)e(1)
           新的统计思想:利用map集合进行统计
           如果题目中没有要求对结果进行排序,默认使用HashMap
           如果题目中要求对结果进行排序,请使用TreeMap
           键:表示要统计的内容
           值:表示次数
         */

        //1.定义字符串
        String str="aababcabcdabcde";

        //2.创建map集合
        TreeMap<Character,Integer> tm=new TreeMap<>();

        //3.遍历字符串,获取每一个字符
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            //4.判断map集合中是否包含该字符
            if(tm.containsKey(c)){
                //5.如果包含,获取该字符对应的值
                Integer value = tm.get(c);
                value++;
                tm.put(c, value);
            }else{
                //6.如果不包含,将该字符作为键,值为1存入map集合
                tm.put(c, 1);
            }
        }

        //遍历map集合,并按照格式输出
        for (Character key : tm.keySet()) {
            Integer value = tm.get(key);
            System.out.print(key+"("+value+")");
        }
    }
}

相关文章:

  • 顺序表:从数组到高效数据管理的进化之路
  • Android studio打包uniapp插件
  • 浅谈JS判断类型的几个方法
  • CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络
  • 在 Vue 中监听常用按键事件(回车,ESC 键,空格等)。
  • Wincc通过VBS脚本控制控件“ Wincc Online Trend Control ”的曲线显示
  • windows开启wsl与轻量级虚拟机管理
  • [Vue]App.vue讲解
  • 【Vue3知识】组件间通信的方式
  • 2025年Python的主要应用场景
  • 查看wifi密码
  • 【AI News | 20250408】每日AI进展
  • layui 弹窗-调整窗口的缩放拖拽几次就看不到标题、被遮挡了怎么解决
  • 痉挛性斜颈康复助力:饮食调养指南
  • 物体检测算法:R-CNN,SSD,YOLO
  • Qt 交叉编译详细配置指南
  • Vue进行前端开发流程
  • 图解Java运行机制-JVM、JRE、JDK区别
  • 方法的重写
  • ubuntu安装openWebUI和Dify【自用详细版】
  • 巴基斯坦称对印度发起军事行动
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 欧洲史上最严重停电事故敲响警钟:能源转型如何保证电网稳定?
  • 河南省平顶山市副市长许红兵主动投案,接受审查调查
  • 习近平出席俄罗斯总统举行的欢迎仪式
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世