自己处理公式

问题说明:

给定一个字符串,例如:

String gsstring = "3565767 + 276756 * 76764 - 76 / 2 + 1";

 如何将其当作数字运算,即相当于:

int gsint = 3565767 + 276756 * 76764 - 76 / 2 + 1;

 我们如何来解析这样一个简单的公式(当前没有括号参与操作 )。

 

第一步:将此字符串变换为字节数组,将问题转换为针对字节数组的处理。

byte[] b = gsstring.getBytes();

第二步:编写工具方法。

    1、判定一个字节是否为数字。

final public static boolean isdig(byte ch) {
		return ch >= '0' && ch <= '9';
}

    2、将所有的数字字节整理为一个真实的数字。

final public static int dig(byte[] b) {
		int record = 0;
		for (int i = 0; i < b.length; i++) {
			record = record * 10 + (b[i] - '0');
		}
		return record;
}

    3、将字节表示的符号转换为真正的运算操作。

	final public static int calc(int record1, int record2, byte oper) {
		int record = 0;
		switch (oper) {
		case '+':
			record = record1 + record2;
			break;
		case '-':
			record = record1 - record2;
			break;
		case '*':
			record = record1 * record2;
			break;
		case '/':
			record = record1 / record2;
			break;
		default:
			break;
		}
		return record;
}

第三步:解析字节数组,将其记录为一个数字的集合以及一个符号的集合。

final public static Vector parse(byte[] b) {
		Vector v = new Vector();
		Vector dig = new Vector();
		Vector sgn = new Vector();
		byte[] bb = null;
		int size, j, k;
		for (int i = 0; i < b.length; i++) {
			size = 0;
			if (isdig(b[i])) {
				j = i;
				do {
					size++;
					j++;
				} while (j < b.length && isdig(b[j]));
				bb = new byte[size];
				j = i;
				k = 0;
				do {
					bb[k] = b[j];
					k++;
					j++;
				} while (j < b.length && isdig(b[j]));
				i = i + size - 1;
				dig.add(new Integer(dig(bb)));
			} else {
				sgn.add(Byte.valueOf(b[i]));
			}
		}
		v.add(sgn);
		v.add(dig);
		return v;
}

第四步:操作得到的结果。

提供思路:这种公式的特点是数字集合总是比符号集合多1,并且都是按照顺序存储的(现在采取的方案是这样)。所以,根据先乘除后加减原则,检索符号集合中的乘除后再检索加减,数字集合位置索引与符号索引之间存在对应关系,不难发现的。

增加处理:

public static int test(String gs) {
		byte[] b = dealByte(gs.getBytes());
		Vector v = parse(b);
		Vector sgn = (Vector) v.elementAt(0);
		Vector dig = (Vector) v.elementAt(1);
		while (sgn.size() != 0) {
			for (int i = 0; i < sgn.size(); i++) {
				if ('*' == ((Byte) sgn.elementAt(i)).byteValue()
						|| '/' == ((Byte) sgn.elementAt(i)).byteValue()) {
					operate(sgn, dig, i);i--;
				}
			}
			for (int i = 0; i < sgn.size(); i++) {
				if ('+' == ((Byte) sgn.elementAt(i)).byteValue()
						|| '-' == ((Byte) sgn.elementAt(i)).byteValue()) {
					operate(sgn, dig, i);i--;
				}
			}
		}
		return ((Integer) dig.elementAt(0)).intValue();
}


static private void operate(Vector sgn, Vector dig, int index) {
		int value = calc(((Integer) dig.elementAt(index)).intValue(),
				((Integer) dig.elementAt(index + 1)).intValue(), ((Byte) sgn
						.elementAt(index)).byteValue());
		sgn.remove(index);
		dig.setElementAt(new Integer(value), index);
		dig.remove(index + 1);
}

此方式完全应用了算式的特点,加入括号处理相对复杂。

如何扩展加入(){}[],变得更强大一点??思考

OK。

 

缠论大师很多,在下才疏学浅,不到之处敬请点拔。另外声明一下,世间没有包赚钱的公式,只有适合的工具。想通过一个什么包赚钱的价格几万的公式来稳赚不赔,那股市就没有输家了。如果有缘份的话,本文最后将推出缠师最终没有告知大家的力度公式部分。真正得缠者,为见相非相,即见如来。 通达信版公式,因为定义不了全局变量、数组,以及没有循环语句等功能,相比大智慧在公式编程方面差了不少。但通达信的优势还是有的,在此推出一个通达信非DLL版本的缠论分笔公式,并在后续的文章中逐步讲解如何通过程序,将缠论转化公式。如果缠友仅想得到一公式而已,那就也无所谓细读本文。但凡得道,靠的是觉悟和缘份,在此也就不细说了。初学缠论的朋友也可以参考一些网站或专门的书籍,对阅读本文会有较大的帮助。 一、分形。 缠论集道氏、波浪、江恩学派于一体,结合浑沌理论,将K线形态以分形的方式进行规划,并以一套规则定义波浪起始点,以中枢的形式表达三角形调整(旗形、契形、钻石等形态,均是三角形形态的变种),以背驰的理论表述力度的衰竭。理论指导实战,行之有效。 分形分二种,一是顶分型,另一是底分型。分型也可以看成是酒田的三山形态,即中间K线高低点均高于二侧的,为顶分型,均低于二侧的,为底分形。当一根K线高低点均在前一根K线价格之类,或者前一根K线高低点均在本根K线价格之类,称为包含关系。在程序处理上,被前一根K线包含的,因为不可能作为分形的顶、底点,所以我们可以不进行处理。如果是后一种包含关系,则观察前一根K线处于什么分形关态,如果前一根是顶分形,则本根向上取值,作为顶分形处理,反之则向下处理为底分形。 但这里有一个特殊情况,在不成笔的情况下,如果这根K线的前一分形状态为低分形,但本K线高点却已经超出了前一个顶分形的顶点,应将这根K线作为顶分形处理,反之亦然。否则,笔的顶底点将不会处于笔内K线的高低点位置。同理,笔有被非笔打破高低点的情况,采取的也是这种办法,即笔的延伸。段亦如此,段被笔打破的,段仍然延续。所以,在最简单的顶底分形的处理上,也应如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值