Java集合TreeMap--LOL有哪些拿剑英雄案例

目录

Class TreeMap

TreeMap的遍历

遍历疾风剑豪(亚索)技能

TreeMap遍历--匿名内部类


Class TreeMap<K,V>

查看API文档我们知道:

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

一个红黑树基于NavigableMap实现。 该地图是根据排序natural ordering其密钥,或通过Comparator在地图创建时提供,这取决于所使用的构造方法。

此实现提供了保证的log(n)时间成本containsKeygetputremove操作。 算法是Cormen,Leiserson和Rivest的算法介绍中的算法的适应性

请注意,如果这个排序的映射要正确地实现Map接口,那么由树映射维护的排序(如任何排序的映射)以及是否提供显式比较器都必须equals Map一致。 (参见ComparableComparator一致的精确定义与equals)。这是因为该Map接口在来定义equals的操作,但一个排序映射使用它所有的键比较compareTo (或compare )方法,于是两个从排序图的角度来说,通过该方法认为相等的键是相等的。 排序地图的行为明确定义的,即使其排序与equals ; 它只是没有遵守Map界面的总体合同。

请注意,此实现不同步。 如果多个线程同时访问映射,并且至少一个线程在结构上修改映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅改变与现有密钥相关联的值不是结构修改。)这通常通过对自然封装映射的一些对象进行同步来实现。 如果没有这样的对象存在,应该使用Collections.synchronizedSortedMap方法“包装”地图。 这最好在创建时完成,以防止意外的不同步访问地图:

  SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...)); 

由这个类的“集合视图方法”返回的iterator方法返回的迭代器是故障快速的 :如果映射在迭代器创建之后的任何时间被结构地修改,除了通过迭代器自己的remove方法,迭代器会抛出一个ConcurrentModificationException 。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。

请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速的迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。

通过此类中的方法返回的所有Map.Entry对,其视图表示生成时映射的快照。 他们支持Entry.setValue方法。 (请注意,可以使用put更改关联地图中的put 。)

这个班是Java Collections Framework的会员

TreeMap:底层数据结构是红黑树

TreeMap的遍历

遍历疾风剑豪(亚索)技能

参考代码:

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

public class TreeMapDemo1 {
    public static void main(String[] args) {
        //创建TreeMap集合对象
        TreeMap<String, String> sstm = new TreeMap<>();

        //添加元素到集合中
        sstm.put("疾风剑豪","亚索");
        sstm.put("被动技能","百折不屈");
        sstm.put("Q技能","斩钢闪");
        sstm.put("W技能","风之壁障");
        sstm.put("E技能","踏前斩");
        sstm.put("R技能","狂风绝息斩");

        //遍历map集合
        Set<Map.Entry<String, String>> entries = sstm.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            String key = entry.getKey();
            String value = entry.getValue();

            System.out.println(key + "---" + value);
        }

        System.out.println("\n亚索连招EQRW");

    }
}

输出结果:

E技能---踏前斩
Q技能---斩钢闪
R技能---狂风绝息斩
W技能---风之壁障
疾风剑豪---亚索
被动技能---百折不屈

亚索连招EQRW

通过输出结果我们得出结论:由于TreeMap底层数据结构是红黑树,所以存储顺序和取出顺序不一定一致 。


TreeMap遍历--匿名内部类

创建Hero类:

import java.util.Objects;

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

    public Hero() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "英雄:{" +
                "姓名='" + name + '\'' +
                ", 年龄=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Hero hero = (Hero) o;
        return age == hero.age &&
                Objects.equals(name, hero.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

}

参考代码:

import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo2 {
    public static void main(String[] args) {

        //创建TreeMap集合对象
        TreeMap<Hero, String> map = new TreeMap<> (new Comparator<Hero>() {

            @Override
            public int compare(Hero o1, Hero o2) {

                //年龄
                int h = o1.getAge() - o2.getAge();

                //姓名
                int h1 = h == 0 ? o1.getName().compareTo(o2.getName()) : h;

                return h1;

            }
        });


        //创建Hero对象
        Hero h1 = new Hero("疾风剑豪", 24);
        Hero h2 = new Hero("封魔剑魂", 28);
        Hero h3 = new Hero("无极剑圣", 68);
        Hero h4 = new Hero("暗裔剑魔", 1002);
        Hero h5 = new Hero("无双剑姬", 16);

        //添加元素到集合中
        map.put(h1,"狂风绝息斩");
        map.put(h2,"封尘绝念斩");
        map.put(h3,"高原血统");
        map.put(h4,"大灭");
        map.put(h5,"无双挑战");

        System.out.println("英雄联盟拿剑的英雄的大招是什么?\n");

        //遍历TreeMap集合
        Set<Map.Entry<Hero, String>> entries = map.entrySet();
        for (Map.Entry<Hero, String> entry : entries) {
            Hero key = entry.getKey();
            String value = entry.getValue();

            System.out.println(key + "---" + value);

        }
    }
}

输出结果:

英雄联盟拿剑的英雄的大招是什么?

英雄:{姓名='无双剑姬', 年龄=16}---无双挑战
英雄:{姓名='疾风剑豪', 年龄=24}---狂风绝息斩
英雄:{姓名='封魔剑魂', 年龄=28}---封尘绝念斩
英雄:{姓名='无极剑圣', 年龄=68}---高原血统
英雄:{姓名='暗裔剑魔', 年龄=1002}---大灭

通过输出结果我们得出结论:使用匿名内部类可以对年龄进行排序,重写equals方法和hashCode方法。


这回你了解了英雄联盟拿剑的英雄有哪些了吗?

🧡🧡到底啦!给靓仔一个关注吧!🧡🧡

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

liangzai2048

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

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

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

打赏作者

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

抵扣说明:

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

余额充值