一、枚举类型——使用 EnumMap 分发

news2024/9/24 23:32:39

使用 EnumMap 可以实现“真正的”双路分发,它是专门为 enum 设计的高效 Map。我们的目标是在两个未知类型中切换,因此由 EnumMap 组成的 EnumMap (嵌套 EnumMap )可以实现双路分发。

RoShamBo5.java

import java.util.EnumMap;

import static enums.TEST0006.Outcome.*;

enum RoShamBo5 implements Competitor<RoShamBo5> {
    PAPER, SCISSORS, ROCK;
    static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table = new EnumMap<>(RoShamBo5.class);

    static {
        for (RoShamBo5 it : RoShamBo5.values()) {
            table.put(it, new EnumMap<>(RoShamBo5.class));
        }
        initRow(PAPER, DRAW, LOSE, WIN);
        initRow(SCISSORS, WIN, DRAW, LOSE);
        initRow(ROCK, LOSE, WIN, DRAW);
    }

    static void initRow(RoShamBo5 it,Outcome vPAPER, Outcome vSCISSORS, Outcome vROCK) {
        EnumMap<RoShamBo5, Outcome> row =RoShamBo5.table.get(it);
        row.put(RoShamBo5.PAPER, vPAPER);
        row.put(RoShamBo5.SCISSORS, vSCISSORS);
        row.put(RoShamBo5.ROCK, vROCK);
    }

    @Override
    public Outcome compete(RoShamBo5 it) {
        return table.get(this).get(it);
    }

    public static void main(String[] args) {
        RoShamBo.play(RoShamBo5.class, 20);
    }
}

Competitor.java

public interface Competitor<T extends Competitor<T>> {
    Outcome compete(T competitor);
}

Outcome.java

public enum Outcome {WIN, LOSE, DRAW}

Enums.java

import java.util.Random;

public class Enums {
    private static Random rand = new Random(47);

    public static <T extends Enum<T>> T random(Class<T> ec) {
        return random(ec.getEnumConstants());
    }

    public static <T> T random(T[] values) {
        return values[rand.nextInt(values.length)];
    }
}

RoShamBo.java

public class RoShamBo {
    public static <T extends Competitor<T>>
    void match(T a, T b) {
        System.out.println(a + " vs. " + b + ": " + a.compete(b));
    }

    public static <T extends Enum<T> & Competitor<T>>
    void play(Class<T> rsbClass, int size) {
        for (int i = 0; i < size; i++) {
            match(Enums.random(rsbClass), Enums.random(rsbClass));
        }
    }
}

运行结果如下:

在这里插入图片描述

EnumMap 是用一个 static() 子句进行初始化的,可以看到对 initRow() 的调用是类似表格的结构。注意 compete() 方法,其在内部的一条语句内发生了两次分发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何 设计一个高质量的 API 接口?

目录 你是否也感同身受&#xff1f; 优秀API的特质 自解释 易学习 易使用 难误用 API 设计原则 1. 充分原则 2. 单一视角原则 3. 单一功能原则 4. 简单原则 5. 抽象原则 6. 兼容扩展原则 7. 最小惊讶原则 8. 低耦合原则 9. 正交原则 10. 易测试原则 11. 统一原…

怎样查看电脑开关机日志

最近想查看家里电脑是否每天都正常关机了。 家里的是Windows电脑。 使用windows自带功能或者说自带工具无疑是最方便的。 按下【开始→运行】&#xff0c;输入eventvwr&#xff0c;按下回车键。 打开事件查看器&#xff0c;展开Windows日志&#xff0c;双击系统。 选择筛…

Redis内存满分析

操作0&#xff1a; dbsize计算db大小&#xff0c;判断是哪个db的问题&#xff0c;发现是db1的问题。 操作1&#xff1a; Redis中先备份xxx.rdb文件&#xff0c;然后使用下面的工具进行分析 Redis内存分析工具之redis-rdb-tools的安装与使用_薛定谔的猫io的博客-CSDN博客 结…

如何在Windows 10中移动文档文件夹位置

默认情况下,Windows将你的个人文档文件夹存储在你帐户的%UserProfile%文件夹中(例如:“C:\Users\Kent”)。 你可以将“文档”文件夹中文件的存储位置更改为硬盘驱动器、其他驱动器或网络上的其他计算机上的其他位置。 一、如果你当前的文档文件夹受 OneDrive 保护,那么你…

记录一个iOS无法找到堆栈信息的崩溃修复

崩溃提示 2023-06-28 21:14:46.9624560800 -[UIDynamicCatalogColor length]: unrecognized selector sent to instance 0x6000073292c0 崩溃如下图所示 思路&#xff0c;既然我们无法通过调用的堆栈信息查找&#xff0c;那就试试通过崩溃对象的内存地址查看该对象的详细信息 …

攻防世界-web-mfw

题目描述&#xff1a;如图&#xff0c;只有这样的三个页面 home页面&#xff1a; about页面&#xff1a; contact页面&#xff1a; burp抓包可以看到返回的html中刚好对应了三个页面&#xff0c;以及注释掉的flag 尝试将page设置成flag&#xff0c;但是并没有什么反应。 1. 思…

【Web 网络管理】网络杂谈(8)之基于 Web 的网络管理

涉及知识点 基于 Web 的网络管理模式&#xff0c;WBM的介绍与标准&#xff0c;WBM的实现方式与关键技术&#xff0c;WBM的安全性考虑。深入了解WBM技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录…

污水厂3D可视化智慧大屏实现统一数据管理和信息化建设

随着城市化进程的加速和人口的不断增长&#xff0c;污水排放量也随之增加。3D可视化技术的出现&#xff0c;为污水厂的管理和运营带来了新的思路和方法。本文将探讨污水厂3D可视化智慧大屏系统的意义。 首先&#xff0c;污水厂3D可视化智慧大屏系统可以帮助管理人员更好地了解…

Unable to open debugger port (127.0.0.1:55305): java.net.BindException

如图idea启动服务端口被占用&#xff0c;如何解决 1.修改启动服务的端口 修改tomcat的启动端口&#xff0c;避免和windows已启动端口占用&#xff08;不推荐&#xff09; 2.杀死占用服务的端口 winR 打开命令行窗口 netstat -aon|findstr “55305” taskkill -f -pid 25512…

汽车租赁系统

汽车租赁系统&#xff0c;java&#xff0c;ssm&#xff0c;tomcat&#xff0c;mysql。包含数据库文件&#xff0c;源码&#xff0c;和项目运行演示介绍视频 idea和eclipse都可以运行。 系统介绍&#xff1a; 角色&#xff1a;管理员&#xff0c;用户 主要功能&#xff1a;汽车资…

解决 vue2 productionTip=false设置无效

原因&#xff1a;在最新版本的Chrome中&#xff0c;在script中使用settimeout&#xff0c;将在允许第一个js完成后立即回调。 第一种&#xff1a; 直接在源码中&#xff0c;将productionTip&#xff1a;true直接改成false 第二种&#xff0c;则是在红框位置改成大于0的任意数值…

建立无需build的react单页面SPA框架

vue、react这种前端渲染的框架&#xff0c;比较适合做SPA。如果用ejs做SPA&#xff08;Single Page Application&#xff09;&#xff0c;js代码控制好全局变量冲突不算严重&#xff0c;但dom元素用jquery操作会遇到很多的名称上的冲突&#xff08;tag、id、name&#xff09;。…

PyTorch Lightning基础入门

Lightning in 15 minutes Lightning in 15 minutes — PyTorch Lightning 2.0.4 documentation 安装 PyTorch Lightning pip install lightning conda install lightning -c conda-forge 定义一个LightningModule LightningModule可以让pytorch的nn.Module可以整合一些训…

一般人不要轻易去学习网络安全(黑客)

笔者本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全联合实验室。 我为啥说自学黑客&#xff0c;一般人我还是劝你算了吧&#xff01;因为我就是那个不一般的人。 首先我谈下对黑客&a…

Nacos报9848

问题&#xff1a; Connection refused: no further information: localhost/0:0:0:0:0:0:0:1:9848 解决&#xff1a; 这里是springboot集成springcloud后&#xff0c;把application.yml改成bootstrap.yml就可以了&#xff0c;不然读取不到nacos配置。

Java调用scala中map转换问题处理

网上代码 把Javamap转为scala的map代码 scala.collection.mutable.Map<String, String> scalaMap JavaConverters.mapAsScalaMapConverter(map).asScala();Object objMap Map$.MODULE$.<String, String>newBuilder().$plus$plus$eq(scalaMap.toSeq());Object Bui…

再以汇编代码分析c++的右值引用

汇编分析c语言的执行结果最为准确。 可见&#xff0c;右值引用其实还是引用&#xff0c; bb 和 cc 都是对 aa 的引用&#xff0c;其内存里存储了 aa 的地址。 而且还有一个很奇特的现象&#xff0c;bb无法给cc赋值&#xff0c;右值引用无法给右值赋值。 同样是调用std:: move…

更换电脑背景为纯黑色(真的一点其他颜色都没有)

1步2步可合并为第一步 1、控制面板 2、优化视觉显示 3、选中确定即可 查看电脑背景图片&#xff0c;纯黑色&#xff0c;无敌呦&#xff01; 你就说牛不牛 吧

惠普232dw/233dw激光打印机手机WIFI连接实操、初始化

0.首先建议&#xff0c;不要买这台垃圾&#xff0c;经常断网&#xff0c;链接不便 1.手机下载 惠普smart 2.长按i键 3.等到x和↓闪烁&#xff0c; 同时按住wifi和x键持续5秒以上&#xff0c;松开时开始自动初始化&#xff0c;等待一段时间&#xff0c;初始化完成&#xff0c…

零知识证明的示例

目录 零知识证明的示例 怎样通过零知识证明验证联邦学习中模型的真伪 零知识证明的示例 1、零知识洞穴 如图表示一个简单的迷宫&#xff0c;C与D之间有一道门&#xff0c;需要知道秘密口令才能将其打开。P向V证明自己能打开这道门&#xff0c;但又不愿向V泄露秘密口令。 可采…