1.概念

一个函数处理多种类型,其实和多态差不多.

但是要处理两种或者多种类型的数据时,就需要判断每种类型以及每种类型所对应的处理.(PS:我只是在走别人的老路,网上一搜这种概念,博客一大堆,我不知道自己写博客总结有没有意义,毕竟已经有那么多博客了,

但是我还是想记录下自己成长的过程,自己差了好多....如果只有一两篇博客还好,一大堆相同概念的博客真的是,差了好多.)

2.解决:

编程思想的处理很有意思,先给出一两个不那么完美的反例,然后循序渐进给出最好的解决方案,并说出每种方案的优点和缺点,这种方式更容易让人印象更深刻,我在这里就不列举那么多栗子了,就举出最优的一两个例子,重复别人的老路,记录下成长.

2.1EnumMap解决

public enum RoShamBo5 implements Competitor<RoShamBo5>{
PAPER, SCISSORS, ROCK;
static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table =
new EnumMap<>(RoShamBo5.class);//创建EnumMap (value 对应的也是一个EnumMap)
static {
for (RoShamBo5 it : RoShamBo5.values()) {
table.put(it, new EnumMap<>(RoShamBo5.class));//先 在 key 中 放入剪刀石头布
}
//在初始化 value 的 EnumMap
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) {
//value 的 EnumMap 中的 key 放入剪刀石头布, value 放入 相对应的结果
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 competitor) {
return table.get(this).get(competitor);
}
public static void main(String[] args) {
RoShamBo.play(RoShamBo5.class, 20);
} }

注释我已经说明了解决思路,就不再重复,这里说下思想: EnumMap和Map差不多,只不过key必须是一个Enum,所以利用这个特性,比如

剪刀  : vs剪刀 平   vs石头 输  vs布 赢

石头  : vs 剪刀 赢 vs石头 平  vs布 输

布  :   vs剪刀 输 vs石头 赢 vs布 平

就把vs前面的  放入key中, 然后相对应的结果 在放入一个EnumMap中,  放入的EnumMap中的 key 为vs后面的, 结果为value. 画图其实能理解,不过我不想画,这个不是教学.

2.2 二维数组解决

public enum RoShamBo6 implements Competitor<RoShamBo6>{
PAPER, SCISSORS, ROCK;
private static Outcome[][] table = {
{DRAW, LOSE, WIN},//PAPER
{WIN, DRAW, LOSE},//SCISSORS
{LOSE, WIN, DRAW}//ROCK
};
@Override
public Outcome compete(RoShamBo6 competitor) {
return table[this.ordinal()][competitor.ordinal()];
}
public static void main(String[] args) {
RoShamBo.play(RoShamBo6.class, 20);
} }

简单明了,我都不想写什么来说明了,就是把石头剪刀布对应的顺序和对手对应的顺序组成下标,和二维数组对应起来,编程思想说这个简单,但是数据大的话不好维护,所以要根据具体的项目来具体分析,还是项目经验太少,很多东西没有完全理解,真的是,程序员换工作真的是逼不得已,只做一个项目不可能成长的,好想做几个大项目.

java 多路分发的更多相关文章

  1. 【转】Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  2. Java enum的用法详解[转]

    Ref:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html 用法一:常量 在JDK1.5 之前,我们定义常量都是: p ...

  3. Java enum的用法详解

    (转自:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html) 用法一:常量 在JDK1.5 之前,我们定义常量都是: ...

  4. Java enum(枚举)的用法详解(转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  5. Java NIO 与 基于reactor设计模式的事件处理模型

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...

  6. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  7. java枚举类型enum的使用

    2015-10-24 java达人 Java 中 的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的E ...

  8. java中enum类型的使用

    java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我 ...

  9. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

随机推荐

  1. 折腾一下WebSocket的ArrayBuffer传输方式

    前言   之前写WebSocket都是基于文本传输的,后来准备升级项目,于是打算尝试一下arraybuffer传输方式,由于是第一次使用javascript处理字符串转arraybuffer,不过真的 ...

  2. sqoop导数据到hive报错

    [root@hadoop1 conf]# sqoop import --connect jdbc:mysql://192.168.122.15:3306/company --username sqoo ...

  3. 13.56Mhz SI522兼容MFRC522的资料以及对比性能

    (13.56Mhz芯片) SI522是一颗专门替代MFRC522/FM17522,PIN对PIN 完全软硬件兼容.相对于MFRC522,SI522完全替换,不需要做任何更改,同时接受模式下功耗低10m ...

  4. EF Core 2.1 Raw SQL Queries (转自MSDN)

    Entity Framework Core allows you to drop down to raw SQL queries when working with a relational data ...

  5. 将硬件规定的通信协议用Lua实现(涉及到很多Lua通信的数据转换)

    1:这次处理的是大唐的gps通信协议,先简单介绍一下他规定的通信规则: 信息结构: 传输说明: 信息结构中的各个字节书写时都是以十六进制标识,两位数组成.传输时,SOI和EOI(SOI=7EH,EOI ...

  6. ios开发遇到的问题

    运行后界面空白,Xcode跳转到APPDelegate.swift文件提示如下 第一种可能原因: 做输出口后在代码中重新命名了输出口 解决方法: 右键控件关闭输出口的连接,变回+号,将它重新连到代码的 ...

  7. ubuntu 如何进行文件、夹删除等操作

    rm [选项] 文件-f, --force 强力删除,不要求确认-i 每删除一个文件或进入一个子目录都要求确认-I 在删除超过三个文件或者递归删除前要求确认-r, -R 递归删除子目录-d, --di ...

  8. OpenStack(queens)最小化搭建记录——控制与计算共两个节点

    境: 2台安装了centos7-minimal的主机 ip地址: 10.132.226.103/24 (controller) 10.132.226.104/24 (compute1) 1.配置主机名 ...

  9. Tomcat 或JBOSS java.lang.ArrayIndexOutOfBoundsException: 8192原因及其解决方法

    2018-04-02 09:24:55 org.apache.catalina.connector.CoyoteAdapter service 严重: An exception or error oc ...

  10. 请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。

    请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [root@zhaokang ~]# date2019年 01月 17日 ...