HashMap和TreeMap

目录

Map之HashMap

HashMap存储自定义类型

TreeMap

概念:

Map集合练习


Map之HashMap

HashMap存储自定义类型

//编写一个自定义类Dog类
public class Dog {
    private String color;
    private int age;
​
    public String getColor() {
        return color;
    }
​
    public void setColor(String color) {
        this.color = color;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public Dog(String color, int age) {
        this.color = color;
        this.age = age;
    }
​
    public Dog() {
    }
​
    //equals和hashCode方法的重写
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dog)) return false;
        Dog dog = (Dog) o;
        return age == dog.age &&
                color.equals(dog.color);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(color, age);
    }
​
    @Override
    public String toString() {
        return "Dog{" +
                "color='" + color + '\'' +
                ", age=" + age +
                '}';
    }
}
​
​
//测试类
/**
 * 我的目标是要来用HashMap存储自定义类型(用自定义类型来当key)
 */
public class Test1 {
    public static void main(String[] args) {
        LinkedHashMap<Object, Object> map = new LinkedHashMap<>();
        Dog dog1 = new Dog("黑毛",2);
        Dog dog2 = new Dog("白毛",1);
        Dog dog3 = new Dog("黄毛",3);
        map.put(dog1,"上海");
        map.put(dog2,"上dsf");
        map.put(dog3,"上sdfsdf");
​
        // 验证所有的狗对象作为key已经存入了map集合中
        // 首先获取所有的key
        Set<Object> keys = map.keySet();
        for (Object key : keys) {
            Object value = map.get(key);
            System.out.println(key+"-----------"+value);
            /*Dog{color='黑毛', age=2}-----------上海
              Dog{color='白毛', age=1}-----------上dsf
              Dog{color='黄毛', age=3}-----------上sdfsdf*/
        }
    }
}
  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

TreeMap

概念:

Java TreeMap类是基于红黑树的实现。它提供了一种有效的方法来按排序顺序存储键值对。

排序方式有两种:自然排序比较器排序;到时使用的是哪种排序,取决于我们在创建对象的时候所使用的构造方法;

public TreeMap()                                    使用自然排序
public TreeMap(Comparator<? super K> comparator)    比较器排序

自然排序很简单,就只要在新建对象是使用new TreeMap<>();不带参数就行,就可以进行自然排序

代码演示:

//比较器排序
public class Test2 {
    public static void main(String[] args) {
        TreeMap<Dog, String> treeMap = new TreeMap<>(new Comparator<Dog>() {//只要在括号里写new Comparator就会自动生成重写方法
            @Override
            public int compare(Dog o1, Dog o2) {
                return o2.getAge()-o1.getAge();//重写年龄的排序 降序
            }
        });
​
        treeMap.put(new Dog("黄",2),"dfsdf");
        treeMap.put(new Dog("白",3),"erw");
        treeMap.put(new Dog("黑",1),"cvbcb");
​
        System.out.println(treeMap);//{Dog{color='白', age=3}=erw, Dog{color='黄', age=2}=dfsdf, Dog{color='黑', age=1}=cvbcb}
    }
}

Map集合练习

计算一个字符串中每个字符出现次数。

这个题最重要的就是

方法介绍

public boolean containKey(Object key):判断该集合中是否有此键。

代码演示:

/**
 * 计算一个字符串中每个字符出现次数。
 */
public class Test3 {
    public static void main(String[] args) {
        String s = "sdlkfjjwefksddvmsdf";
        //用一个map集合把该字符串的字符和次数存起来,键放字符,值放次数
        HashMap<Character, Integer> map = new HashMap<>();
        //获取每个字节
        for (int i = 0; i <s.length() ; i++) {
            char c = s.charAt(i);
            // 判断该字符是否在map集合中存在,如果存在则次数+1,否则把次数设置为1
            if(map.containsKey(c)){//判断该集合中是否有此键。
                Integer integer = map.get(c);//得到原来的次数
                integer++;//原来的次数加1
                map.put(c,integer);//更新
            }else{//如果该字符没有出现过,就直接设置为1
                map.put(c,1);
            }
        }
        System.out.println(map);//{s=3, d=4, e=1, f=3, v=1, w=1, j=2, k=2, l=1, m=1}
    }
}
​

模拟斗地主洗牌发牌(讨厌这个题好复杂)

代码演示:

/**
 * 斗地主
 */
public class Test4 {
    public static void main(String[] args) {
        // 把数字与牌对应起来
        HashMap<Integer, String> map = new HashMap<>();
        // 把数字放进list集合中存储
        ArrayList<Integer> list = new ArrayList<>();
//        map.put(1,"黑桃A");
//        map.put(2,"红桃A");
​
        // 构建纸牌;由数字+花色组成
        String s = "2-A-K-Q-J-10-9-8-7-6-5-4-3";
        String nums[] =s.split("-");
        String oldcolor = "♥-♠-♦-♣";
        String[] colors = oldcolor.split("-");
        int flag = 2;
        for (String num : nums) {
            for (String color : colors) {
                String pooker = color+num;
                map.put(flag,pooker);
                list.add(flag);
                flag++;
            }
        }
        //将大王小王添加到集合
        map.put(0, "大王");
        map.put(1, "小王");
        list.add(0);
        list.add(1);
​
        // 定义玩家
        ArrayList<Integer> player1 = new ArrayList<Integer>();
        ArrayList<Integer> player2 = new ArrayList<Integer>();
        ArrayList<Integer> player3 = new ArrayList<Integer>();
        ArrayList<Integer> diPai = new ArrayList<Integer>();
​
        // 洗牌
        Collections.shuffle(list);
​
        // 发牌
        //遍历牌号的集合 判断索引发牌号
        for(int i = 0 ;i < list.size() ;i++) {
            Integer pookerNum = list.get(i);
​
            if (i >= 51) {
                diPai.add(pookerNum);
            } else if (i % 3 == 0) {
                player1.add(pookerNum);
            } else if (i % 3 == 1) {
                player2.add(pookerNum);
            } else if (i % 3 == 2) {
                player3.add(pookerNum);
            }
        }
​
        // 理牌
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
​
        // 看牌
        show("罗璇",player1,map);
        show("万人迷",player2,map);
        show("陈总",player3,map);
        // 显示底牌
        for (Integer integer : diPai) {
            String value = map.get(integer);
            System.out.println("底牌是:"+value);
        }
    }
    //定义方法 看牌
    public static void show(String name,ArrayList<Integer> player,HashMap<Integer, String> pookerMap ){
        System.out.print(name+":");
        for(Integer pookerNum : player){
            String thisPooker = pookerMap.get(pookerNum);
            System.out.print(thisPooker+" ");
        }
        System.out.println();//罗璇:大王 ♥2 ♠2 ♦2 ♣2 ♥K ♦Q ♠J ♠10 ♦9 ♥8 ♣7 ♠6 ♦6 ♣5 ♠4 ♦4 
//万人迷:♦A ♥Q ♣Q ♥J ♣J ♥10 ♦10 ♠9 ♣8 ♥7 ♠7 ♥6 ♣6 ♥4 ♣4 ♠3 ♦3 
//陈总:小王 ♥A ♠A ♣A ♠K ♦K ♠Q ♦J ♣10 ♥9 ♣9 ♠8 ♦8 ♦7 ♠5 ♥3 ♣3 
//底牌是:♣K
//底牌是:♥5
//底牌是:♦5
    }
}
​
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值