Java—-双列集合

Map

键值对(key,value)

new不是new map对象,是new实现类的对象

Map<String,String> map = new HashMap<String,String>();

put会覆盖 以最新的为主

m.put("a","b");
String value=m.put("a","c");
System.out.println(value);  //如果键已经存在,则返回的是原有值b
System.out.println(m);  //而集合里显示最新的c

遍历方式(3种)

一、键找值

//1.把所有的键放到一个单列集合中  
 Set<String> keys=map.keySet();
//2.遍历单列集合,得到每一个键
    for(String key:keys){
        System.out.println(key);
//3.利用map集合中的键获取对应的值
        String value =map.get(key);
        System.out.println(key+" "+value);
    }

二、键值对

获取键值对对象,分别用getKey()和getValue()获取键、值

 Map<String,String> map = new HashMap<String,String>();
        Set<Map.Entry<String, String>> entries = map.entrySet();//map.entrySet()再自动补全即可
        //遍历entries集合,用get方法获取键值(entries调用for循环)
        for (Map.Entry<String, String> entry : entries) {
            String key =entry.getKey();
            String value=entry.getValue();
            System.out.println(key+" "+value);
        }

三、Lambda表达式

HashMap

package Oct18;

import java.util.Objects;

public class Student {
    private String name;
    private int age;
    //右键,ptg to javabean
    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;
    }

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

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

法一: 

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

public class One {
    public static void main(String[] args) {
    //由于学生放在键上,所以要重写hashCode和equals方法
    //创建hashmap对象
    HashMap<Student,String> hm = new HashMap<>();
    //创建三个学生对象
        //ctrl+d向下复制一行
        Student s1 = new Student ("625",21);
        Student s2 = new Student ("cy",20);
        Student s3 = new Student ("小小鸠",3);
    //添加元素
    hm.put(s1,"辽宁");
    hm.put(s2,"湖南");
    hm.put(s3,"江苏");
    //遍历集合
    Set<Student> keys = hm.keySet();
        for (Student key : keys) {
            String value = hm.get(key);
            System.out.println(key+"="+value);

        }

    }

}

 法二:

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

法三:

 

结果: 


package Oct18;

import java.util.*;

public class Two {
    public static void main(String[] args) {
        //1.定义四个数组存储四个景点
        String[] arr={"A","B","C","D"};
        //利用随机数模拟80个同学的投票
        ArrayList<String> list=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i < 80; i++) {
            //在arr的长度内随机生成索引,然后再通过索引找到对应元素
            int index = r.nextInt(arr.length);//随机索引
            System.out.println(arr[index]);//打印同学的投票
            list.add(arr[index]);
        }
            //80个同学投完票了,开始统计
            //string代表景点名称 integer代表景点出现次数
            HashMap<String,Integer> hm =new HashMap<>();
            //hm是hashmap对象;name是临时变量代表景点名;
            for (String name : list) {
                //判断当前景点在map里面是否存在

                if(hm.containsKey(name)){
                    //景点已存在,次数+1
                    //先获取当前景次数
                    int count = hm.get(name);
                    count++;
                    //更新次数
                    hm.put(name,count);
                }
                else{
                //景点不存在,创建景点,次数为一
                hm.put(name,1);
                }
            }
            System.out.println(hm);
        //求哪个景点人最多(那个map里谁的值最大)
        int max =0;
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        //这句话Set<>代表集合;每个Map.Entry<>代表一个键值对;<>为泛型。
        //这句话用来获取HashMap hm 中所有键值对的集合,然后后续的代码通过遍历entries集合来处理键值对
        //hm是hashmap对象,hm.entrySet()返回一个包含HashMap中所有键值对(即键和对应的值)的集合
        //entry是一个键值对(Map.Entry),entries是包含所有键值对的集合(Set类型)
        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(count>max){
                max=count;
            }
        }
        System.out.println("最大值是:"+max);
        //哪些景点都是最大值,都得打印
        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(count==max){
                System.out.println("投票最多的是:"+entry.getKey());
            }

        }

        }

}



LinkHashMap

package Oct18;
import java.util.LinkedHashMap;

public class LinkHashMap {
    public static void main(String[] args) {
        //1.创建集合
        LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
        //2.添加元素
        lhm.put("a",123);
        lhm.put("a",123);
        lhm.put("b",456);
        lhm.put("c",789);

    }
}

TreeMap

代码书写两种排序规则如果都写了,则以第二种(Comparator)为准。

默认升序排列

package Oct18;
import java.util.Comparator;
import java.util.TreeMap;

public class TreeMap1 {
    public static void main(String[] args) {
        //改变排序方式:在小括号里,new Comparator(若什么都不写则默认升序)
        TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //o1:当前要添加的元素
                // o2:已经在红黑树中存在的元素
                return o1-o2;//升序
                //return o2-o1; 降序
                return 0;
            }
        });
        tm.put(1,"cy");
        tm.put(2,"625");
        tm.put(3,"小小鸠1");
        tm.put(4,"小小鸠2");
        tm.put(5,"小小鸠3");
        System.out.println(tm);



    }
}

TreeMap 

package Oct18;

import java.util.TreeMap;

public class TreeMap2 {
    public static void main(String[] args) {
        TreeMap<Student2,String> tm =new TreeMap<>();
        Student2 s1 =new Student2("625",21);
        Student2 s2 =new Student2("cy",20);
        Student2 s3 =new Student2("小小鸠",3);
        tm.put(s1,"辽宁");
        tm.put(s2,"湖南");
        tm.put(s3,"江苏");
        //要利用Comparable指定打印顺序(姓名年龄一样的为同一个人;升序排列)
        System.out.println(tm);

    }
}

 Student

package Oct18;

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


    public Student2() {
    }

    public Student2(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 "Student2{name = " + name + ", age = " + age + "}";
    }

    @Override
    public int compareTo(Student2 o) {
        //指定比较规则:姓名年龄一样的为同一个人;升序排列
        //this:当前要添加的
        //o:在红黑树中已存在的元素
        int i=this.getAge()-o.getAge();
        //返回值:
        //正数:当前大,存右边
        //负数:当前小,存右边
        //0:当前已存在,舍弃
        //已存在则按名字排序(i==0),否则返回i本身(i!=0)
        i=(i==0?this.getName().compareTo(o.getName()):i);
        return i;
    }
}

注意这段方法重写:

结果排序用TreeMap,不要求排序用HashMap

package Oct18;

import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;

public class TreeMap3 {
    public static void main(String[] args) {
        String s="ashdajdknqjbasababab";
        TreeMap<Character,Integer> tm=new TreeMap<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //在循环内,通过 s.charAt(i) 获取字符串's'中索引为i的字符,并将它赋给变量c
            if(tm.containsKey(c)){
                //把原次数拿出来
                int count =tm.get(c);
                //加一
                count++;
                //添加结果
                tm.put(c,count);
            }else{
                tm.put(c,1);
            }
        }
        System.out.println("------------默认排序-----------");
        System.out.println(tm);
        System.out.println("------------StringBulider自定义排序------------");
        //遍历集合,按照指定样式拼接
        StringBuilder sb =new StringBuilder();
        /*tm.forEach(new BiConsumer<Character, Integer>() {
            @Override
            public void accept(Character key, Integer value) {
                sb.append(key).append("(").append(value).append(")");
            }
        });*/
        //简略为Lamda表达式
        tm.forEach((key, value)-> sb.append(key).append("(").append(value).append(")"));
        System.out.println(sb);
        System.out.println("------------StringJoiner自定义排序-------------");
        //要指定开始结束和间隔符号
        StringJoiner sj =new StringJoiner("","","");
        //add后面括号里要为字符串,不是字符串的直接+""即可
        tm.forEach((key, value)-> sj.add(key+"").add("(").add(value+"").add(")"));
        System.out.println(sj);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

参宿七625

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值