综述

周易是中国传统文化的基石. 涵盖了包括哲学在内的多个学科. 对于周易的理解, 可谓见仁见智. 在最近一个项目中需要使用农历, 并进行简单的五行关系比较. 我上网找了一下, 这方面的资料很多, 道理也不复杂, 但是真正可以使用的类库却完全没有. 所以我打算把自己建立的类库共享出来, 使其他人不需要做相同的重复劳动.

本人并非专门研究周易, 甚至还算不上易学爱好者. 只是在日常生活中偶有接触, 感概于其精妙. 本系列文章与周易等哲学和无直接关系, 这里只是粗浅地使用计算机语言(Java)来对周易中一些概念进行建模, 以其能复用于不同项目中.

太极

周易之中, 万象均始于太极(道生一,一生万物). 故先定义接口太极(Taiji). 由于万象均有其名称及其它属性, 为了便于计算机理解, 这里为万物定义一个值(value)属性,该属性是万物在特定领域的一个特征值. 另外再定义一个属性(name)用于表示对象的标识, 使得人可以易于理解计算机所表达.

/*** <B>Taiji</B>*  太极.万象均循此道.* */
public interface Taiji {public String getName();public int getValue();}

/*** <B>AbstractTaiji</B>* 太极的抽象实现*/
public abstract class AbstractTaiji implements Taiji {protected int value;protected String name;protected AbstractTaiji(int value,String name) {this.value = value;this.name = name;}@Overridepublic String getName(){return name;}@Overridepublic int getValue(){return value;}@Overridepublic String toString() {return name;}@Overridepublic boolean equals(Object other) {if (other == null) {return false;}if (other instanceof AbstractTaiji) {return ((AbstractTaiji) other).value == value;}return false;}@Overridepublic int hashCode() {return ((Integer)value).hashCode();}
}

易有太极,是生两仪. 有了太极,接下来就要定义两仪.两仪也就是阴阳, <<素问>>曰:" 阴阳者,天地之道也,万物之纲纪,变化之父母". 两仪变化生四象. 四象由两仪变化而来, 为了方便, 这里直接定义四象, 而不单独定义两仪.

/*** <B>FourQuadrant</B>* 四象
*/
public class FourQuadrant extends AbstractTaiji{/**  少阳 */public static final int SHAO_YANG = 0;/** 少阴*/public static  final int SHAO_YIN = 1;/** 太阳  */public static  final int TAI_YANG = 2;/** 太阴 */public static  final int TAI_YIN = 3;    private static final String[] QUADRANT_NAMES=new String[]{LiuyaoStringSymbol.FourQuadrant_SHAO_YANG,LiuyaoStringSymbol.FourQuadrant_SHAO_YIN,LiuyaoStringSymbol.FourQuadrant_TAI_YANG,LiuyaoStringSymbol.FourQuadrant_TAI_YIN};public static FourQuadrant getFourQuadrant(int value) {return create(value);
    }public static FourQuadrant[] getFourQuadrant() {FourQuadrant[] fourQuadrants=new FourQuadrant[4];for(int i=0;i<4;i++){fourQuadrants[i] =create(i);}return fourQuadrants;}private static FourQuadrant create(int value) {return new FourQuadrant(value, QUADRANT_NAMES[value%4]);}private FourQuadrant(int v, String name) {super(v, name);}@Overridepublic boolean equals(Object obj) {if (super.equals(obj) && (obj instanceof FourQuadrant)) {return true;}return false;}/** 老阳动化为少阳 */public FourQuadrant toTwoForms() {if (value == TAI_YANG) {return getFourQuadrant(SHAO_YANG);} else if (value == TAI_YIN){return getFourQuadrant(SHAO_YIN);} else if (value == SHAO_YANG || value == SHAO_YIN) {return this;} else {return null;}}/** 返回变爻:阳动返回少阴 */public FourQuadrant getChanged() {//FIXMEif(value ==TAI_YANG){return getFourQuadrant(SHAO_YIN);}if (value == TAI_YIN) {return getFourQuadrant(SHAO_YANG);}return new FourQuadrant(value, name);}/** 动: 阴变阴动;阳变阳动 */public void activate(){changeValue(value%2+2);}private void changeValue(int newValue) {this.value=newValue;this.name = QUADRANT_NAMES[newValue];}/**  阳转为阴,阴转为阳     */public FourQuadrant reverse() {if(isChanged()){throw new IllegalArgumentException();}return getFourQuadrant((value+1)%2);}/** 是否为老阳O 老阴X */public boolean isChanged() {return (value==TAI_YANG ||value==TAI_YIN);}
}

这里为什么不定义为枚举(enum)类?

这主要考虑古人对概念的抽象性过高. 比如阴阳或后面要说的五行, 其字面意义看起来比较简单, 但在现实中,不同领域的应用却又有不同属性. 比如五行在中医里面所代表的事物和天文学甚至预测学中的意义是相差很大的. 我们知道Java的enum类不支持继承,若将这些基本属性定义为枚举类, 会带来一些重复工作. 所以为了简便起见, 这里不使用枚举类.

四象定义好了, 接下来要定义万物了. 万物都离不开道的原始属性, 却又有其自身特有的属性. 万物之间又有各种各样的联系,我们无法一一将其列举.为了简单地表示万物之间的关系, 古人将世间事物分为五种(五行),即金木水火土. 并用五行之间的相生相克的关系来解释事物之间的关系. 五行的定义和四象基本一样, 代码也几乎完全重复, 但这里又不得不将其区分出来.

/*** <B>FiveElements</B>* 五行*/
public class FiveElements extends AbstractTaiji {public static final int GOLD=0;public static final int WATER=1;public static final int WOOD=2;public static final int FIRE=3;public static final int SOIL=4;private static final String[] ELEMENTS_NAMES=new String[]{LiuyaoStringSymbol.FIVE_ELEMENT_GOLD,LiuyaoStringSymbol.FIVE_ELEMENT_WATER,LiuyaoStringSymbol.FIVE_ELEMENT_WOOD,LiuyaoStringSymbol.FIVE_ELEMENT_FIRE,LiuyaoStringSymbol.FIVE_ELEMENT_SOIL};public static FiveElements getElement(int value) {return create(value);}private static FiveElements create(int value) {return new FiveElements(value, ELEMENTS_NAMES[value%4]);}/** 相生 */public static final int Generate = 1<<1;/** 相克 */public static final int Restricte = 1<<2;private FiveElements(int v, String name) {super(v, name);}/** 生 */public boolean isGenerate(FiveElements other) {return (value + 1) % 5 == other.value;}/** 克 */public boolean isRestricte(FiveElements other) {return (value + 2) % 5 == other.value;}
}

五行还可以再细分. 比如黄历中使用的五行和周易其它分支使用的五行有所不同, 这时可以按照自己的需要定义五行的具体类. 这里, 如果金木水火土各有其明确且不同的定义,也可以将其作为五行的子类来定义 . 如果具体的五行实现类之间又有复杂的关系, 不推荐将这些关系定义到具体的五行类里面(会使类变得臃肿且难以复用), 这里可以另外定义一个工具类来计算之间的关系. 如下图

五行子类定义示意图

由于在线编辑很麻烦, 这一篇就到这里. 下一篇使用客户端来编辑.

下一篇 天干与地支

转载于:https://www.cnblogs.com/easytao/archive/2012/07/14/easytao.html

[EasyTao(道)系列文章之一]太极之道相关推荐

  1. 华为数据之道_华为构筑产业数字化的太极之道

    产业数字化正在今天经历快速变化. 自华为企业BG发布数字平台之后的7个月里,产业智能已经达成了广泛的行业共识.驱动传统经济向数字经济快速过渡被提升为国家战略,大量技术.人才.资金涌入产业数字化浪潮当中 ...

  2. 入行之初,如鱼得水【程序员成长之道系列文章之2】

    当我们选择程序员这个职业以后,相信每个人内心中都至少会有一些以技术自居的骄傲.对于其他行业的人来说,我们做的事情是神秘的.无法理解的,程序员就像是迷一般的行业,旁人的这些看法更加深了我们以技术自居的傲 ...

  3. 【读后感】Netty 系列之 Netty 高性能之道 - 相比 Mina 如何 ?

    [读后感]Netty 系列之 Netty 高性能之道 - 相比 Mina 如何 ? 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  4. 语言题库体型判断问题_1000道Python题库系列分享20(43道填空与判断题)

    本期题目: 参考答案: 温馨提示 进入公众号,通过菜单"最新资源"==>"历史文章"可以快速查看分专题的文章列表,通过"最新资源"== ...

  5. Leecode15. 三数之和——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  6. 1000道Python题库系列分享20(43道填空与判断题)

    本期题目: 参考答案: 温馨提示 进入公众号,通过菜单"最新资源"==>"历史文章"可以快速查看分专题的文章列表,通过"最新资源"== ...

  7. 1000道Python题库系列分享十一(9道)

    上一期题目链接:1000道Python题库系列分享十(37道) 上一期题目答案: 本期题目: ----------喜大普奔---------- 1.董付国老师Python系列教材,亚马逊.京东.当当. ...

  8. 1000道Python题库系列分享十(37道)

    上一期题目链接:1000道Python题库系列分享九(31道) 上一期题目答案: 本期题目: ----------喜大普奔---------- 1.董付国老师Python系列教材,亚马逊.京东.当当. ...

  9. 如何获取公众号文章并保存有道笔记

    如何获取公众号文章并保存有道笔记 写作目的 1. 获取公众号文章链接 2. 解析公众号文章 3. 保存有道笔记 源代码 最后感想 写作目的 做这个程序是出于自己的学习目的.因为我有学习英语的习惯,每天 ...

最新文章

  1. java 嵌套对象序列化_在javascript中将复杂的,嵌套的,用户定义的对象序列化为字符串...
  2. java 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)
  3. Java中classpath配置
  4. discuz search.php修改,discuz程序如何将热门搜索修改为指向门户搜索的方法
  5. linux sed名宁,Linux shell利用sed批量更改文件名的方法
  6. 1-7:学习shell之透过shell看世界
  7. Javascript远程加载框架 - JFO Remote Framework 1.0
  8. UNBUNTU下与VirtualBox的WINDOWS共享文件夹
  9. 跳过授权列表--skip-grant-list--案例
  10. 网页效果图设计之色彩配色索引
  11. wx.scanCode(Object object)使用详解
  12. python基础练习题:查找首都【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  13. 电商小程序实战教程-分类导航
  14. java常量final是什么_java:变量,常量和final关键字--基础篇
  15. SQL查询语句练习(一)
  16. Caj论文转pdf(带书签目录)
  17. codeforces 有意思的思维题 1 ~ 15
  18. 持续交付2.0(一至三章)
  19. Linux 查找命令(find、locate 、grep )
  20. 翻转课堂---案例1

热门文章

  1. Mybatis使用总结
  2. oracle 树状结构一直出现不了_SEO站内优化:网站结构优化(十一)
  3. IDEA HTTP状态 404 - 未找到 请求的资源[/]不可用
  4. SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作
  5. 009_字符串内建函数
  6. 009_Get请求中文乱码
  7. android教程登陆,【教程】Android 记住密码和自动登录界面的实现
  8. centos打显卡驱动命令_CentOS7显卡驱动问题
  9. 自定义控件:等比例显示控件RatioLayout
  10. 牛客java面试题总结版(四)