(day12) 自学Java——集合进阶(双列集合)

目录

1.双列集合特点

Map遍历三种方式

2.HashMap

3.LinkedHashMap

4.TreeMap

5.源码解析

6.可变参数(形参个数可变)

7.Collections

8.综合练习


1.双列集合特点

①双列集合一次需要存一对数据,分别为键和值
②键不能重复,值可以重复
③键和值是一—对应的,每一个键只能找到自己对应的值
④键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”

 Map是接口,不能直接创建对象,要创建它实现类的对象。

Map遍历三种方式

Map遍历方式:
1.键找值

2.键值对

3.Lambda表达式

练习:用键找值的方式遍历map集合,要求:用装着键的单列集合,使用增强for的形式遍历。

        用键找值的方式遍历map集合,要求:用装着键的单列集合,使用迭代器的形式遍历。

        用键找值的方式遍历map集合,要求:用装着键的单列集合,使用Lambda的形式遍历。

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

public class MapDemo {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("bk","pp");
        map.put("文总","包包");
        map.put("桃桃","福福");
        //获取所有的键,将键放到单列集合中
        Set<String> keys=map.keySet();
        //增强for遍历
        for (String key : keys) {
            String value=map.get(key);
            System.out.println(key+"="+value);
        }
        //迭代器
        Iterator<String> it=keys.iterator();
        while (it.hasNext()){
            String keys1=it.next();
            String value1=map.get(keys1);
            System.out.println(keys1+"="+value1);
        }
        //lambda
        keys.forEach(s-> {
                String value2=map.get(s);
                System.out.println(s+"="+value2);
        });
    }
}

练习:用键找值的方式遍历map集合,要求:用装着键值对的单列集合,使用增强for的形式遍历。

        用键找值的方式遍历map集合,要求:用装着键值对的单列集合,使用迭代器的形式遍历。

        用键找值的方式遍历map集合,要求:用装着键值对的单列集合,使用Lambda的形式遍历。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

public class MapDemo {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("bk","pp");
        map.put("文总","包包");
        map.put("桃桃","福福");
        //获取键值对,将键放到单列集合中
        Set<Map.Entry<String,String>> entries=map.entrySet();
        //增强for遍历
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+"="+entry.getValue());
        }
        //迭代器
        Iterator<Map.Entry<String, String>> it=entries.iterator();
        while (it.hasNext()){
             Map.Entry e=it.next();
            System.out.println(e.getKey()+"="+e.getValue());
        }
        //lambda
        entries.forEach(new Consumer<Map.Entry<String, String>>() {
            @Override
            public void accept(Map.Entry<String, String> stringStringEntry) {
                System.out.println(stringStringEntry.getKey()+"="+stringStringEntry.getValue());
            }
        });
    }
}

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

public class MapDemo {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("bk","pp");
        map.put("文总","包包");
        map.put("桃桃","福福");

//使用Lambda方式遍历
        map.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String keys, String values) {
                System.out.println(keys+"="+values);
            }
        });

//简化Lambda
        map.forEach((keys,values)-> System.out.println(keys+"="+values));
    }
}

2.HashMap

import java.util.HashMap;

public class Test {
    public static void main(String[] args){
        HashMap<Student,String> hm=new HashMap<>();
        Student s1=new Student("zhangsan",18);
        Student s2=new Student("lisi",19);
        Student s3=new Student("zhangsan",18);
        hm.put(s1,"sichuang");
        hm.put(s2,"beijing");
        hm.put(s3,"sichuang");
        //lambda
        hm.forEach((student, s)-> System.out.println(student+","+s));
    }
}
package study.api;

import java.util.Objects;

public class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    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);
    }
}

import java.util.*;

public class Test {
    public static void main(String[] args){
        String[]arr={"A","B","C","D"};
        ArrayList<String> list=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i < 80; i++) {
            int index=r.nextInt(arr.length);
            list.add(arr[index]);
        }
        HashMap<String,Integer> hm=new HashMap<>();
        for (String name : list) {
            if (hm.containsKey(name)){
                int count=hm.get(name);
                count++;
                hm.put(name,count);
            }
            else {
                hm.put(name,1);
            }
        }
        //求最大值max
        int max=0;
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            System.out.println(entry.getKey()+","+entry.getValue());
        }
        for (Map.Entry<String, Integer> entry : entries) {
            int num=entry.getValue();
            if(num>max){
                max=num;
            }
        }
        System.out.println(max);
        //求最多人想去的地点
        for (Map.Entry<String, Integer> entry : entries) {
            if (entry.getValue()==max){
                System.out.println(entry.getKey());
            }
        }
    }
}

3.LinkedHashMap

4.TreeMap

 

5.源码解析

向上箭头,表示重写了Map里的compute方法。(表示重写过的)

向右箭头,表示compute方法来自于Map。(表示来自哪个类或接口)

 f(field),表示HashMap的属性,可能是成员变量,或者常量

6.可变参数(形参个数可变)

格式:属性类型...名字 

例:int...args

 

练习:可变参数的练习

假如需要定义一个方法求和,该方法需要满足以下要求:
计算2个数据的和,计算3个数据的和,计算4个数据的和,计算n个数据的和

 

 

7.Collections

集合工具类Collections

8.综合练习

练习1:随机点名器

班级中有n个学生,随机点名

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> al=new ArrayList<>();
        Collections.addAll(al,"bk","pp","win","perm","boun","peat","fort");
        Collections.shuffle(al);
        System.out.println(al.get(0));
        //第二种
        Random r=new Random();
        int index=r.nextInt(al.size());
        System.out.println(al.get(index));
    }
}

练习2:随机点名器

班级里有n个学生,要求:70%的概率随机到男生,30%的概率随机到女生

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class ArrayListTest {
    public static void main(String[] args) {
        //在一个集合中存入七个1(70%),三个0(30%),打乱随机抽取
        // 抽到1就在男生集合中随机抽人,抽到0就在女生集合抽人
        ArrayList<Integer> num=new ArrayList<>();
        ArrayList<String> boy=new ArrayList<>();
        ArrayList<String> girl=new ArrayList<>();
        Collections.addAll(num,1,1,1,1,1,1,1,0,0,0);
        Collections.addAll(boy,"张三","李四","范闲","bk","pp","win");
        Collections.addAll(girl,"杨颖","白鹿","迪丽","欣欣","三三");
        //打乱1,0,抽取1,0
        Collections.shuffle(num);
        int flag=num.get(0);
        Random r=new Random();
        if(flag==1){
            int index=r.nextInt(boy.size());
            System.out.println(boy.get(index));
        }else {
            int index=r.nextInt(girl.size());
            System.out.println(girl.get(index));
        }
    }
}

练习3:随机点名器

班级里有n个学生,要求:被点到的学生不会再被点到,但是如果班级中的所有学生都点完了,需要重新开启第二轮点名。

import java.util.ArrayList;
import java.util.Collections;

public class ArrayListTest {
    public static void main(String[] args) {
        //将集合中的人抽取出来,存入另外的集合,再删掉被抽取出来的人(当前集合)
        ArrayList<String> list1=new ArrayList<>();
        Collections.addAll(list1,"bk","pp","win","perm","boun","peat","fort");
        //创建一个集合2,将name存进去
        ArrayList<String> list2=new ArrayList<>();
        //记录集合list1的长度
        int count=list1.size();
        //点名10轮
        for (int j=0;j<10;j++) {
            System.out.println("===========第"+(j+1)+"轮点名============");
            for (int i = 0; i < count; i++) {
                //打乱,抽取
                Collections.shuffle(list1);
                String name=list1.get(0);
                list2.add(name);
                System.out.println(name);
                //在当前集合删除,抽取出来的name
                list1.remove(name);
            }
            //重开,将list2的数据,复制到list1中,然后清除list2的内容
            list1.addAll(list2);
            list2.clear();
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值