`
hunanlzg
  • 浏览: 692 次
社区版块
存档分类
最新评论

在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字符串,看所传入的参数是否在表达式内

阅读更多
今天在项目中需要解析一个参数范围的字符串,然后判断一个传入参数是否在这个表达式内。因为参数范围字符串是(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的组合,所以我觉得直接去进行split处理比较麻烦,就运用了String转为 byte[] 再做处理。代码如下。
不知道大家有没有更好的处理方式。
package test_lzg;

import java.util.ArrayList;
import java.util.List;

public class A {
	public static void main(String[] args) {
		String paramRangeString = "0<p<=10";
		String paramStr = "11";
		System.out.println(parseParamRange(paramRangeString, paramStr));

		paramRangeString = "0<=p<=10";
		paramStr = "5";
		System.out.println(parseParamRange(paramRangeString, paramStr));
	}

	/**
	 * 解析参数范围表达式
	 * 
	 * @param paramRangeString 表达式的字符串。表达式可能为(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)
	 * @param paramStr 需要判断的参数
	 * @return
	 */
	private static boolean parseParamRange(String paramRangeString, String paramStr) {
		byte[] paramRangeByteArr = paramRangeString.getBytes(); // 将字符串转换为byte[]来处理
		List<Byte> minNumList = new ArrayList<Byte>();
		List<Byte> maxNumList = new ArrayList<Byte>();
		String leftOpt = "";
		String rightOpt = "";
		boolean isLeftOpt = true; // 标记是第一次出现还是第二次出现,第一次为true
		for (int i = 0, len = paramRangeByteArr.length; i < len; i++) {
			if (paramRangeByteArr[i] == 60) { // 60 是"<"对应的ascii 码
				if (paramRangeByteArr[i + 1] == 61) { // 61 是"="对应的ascii 码
					if (isLeftOpt) {
						leftOpt = "<=";
					} else {
						rightOpt = "<=";
					}
					i++;
				} else {
					if (isLeftOpt) {
						leftOpt = "<";
					} else {
						rightOpt = "<";
					}
				}
				isLeftOpt = false;
				continue;
			}
			if (48 <= paramRangeByteArr[i] && paramRangeByteArr[i] <= 57) { // 48是 "0"的 ascii码,57是"9"的ascii码
				if (isLeftOpt) {
					minNumList.add(paramRangeByteArr[i]);
				} else {
					maxNumList.add(paramRangeByteArr[i]);
				}
			}
		}
		// 将左边界的数从list中,放入byte[],方便转换为String
		byte[] leftBorder = new byte[minNumList.size()];
		for (int i = 0, len = minNumList.size(); i < len; i++) {
			leftBorder[i] = minNumList.get(i);
		}

		// 将右边界的数从list中,放入byte[],方便转换为String
		byte[] rightBorder = new byte[maxNumList.size()];
		for (int i = 0, len = maxNumList.size(); i < len; i++) {
			rightBorder[i] = maxNumList.get(i);
		}

		// 打印测试,看解析是否正确
		System.out.println(new String(leftBorder) + leftOpt);
		System.out.println(rightOpt + new String(rightBorder));

		return judgeParamRange(paramStr, new String(leftBorder), leftOpt, true)
				&& judgeParamRange(paramStr, new String(rightBorder), rightOpt, false);
	}

	/**
	 * 
	 * 判断参数是否在该范围
	 *
	 * @param paramStr 需要判断的参数
	 * @param borderParamStr 边界值
	 * @param opt 与边界值相关的符号(< or <=)
	 * @param isLeftBorder 是否是左边界
	 * @return
	 */
	private static boolean judgeParamRange(String paramStr, String borderParamStr, String opt, boolean isLeftBorder) {
		Float borderParam = Float.valueOf(borderParamStr); // 将边界值转换为 Float
		Float param = Float.valueOf(paramStr); // 将需要判断的参数转换为Float
		if (isLeftBorder) { // 如果为左边界
			if ("<".equals(opt)) {
				if (borderParam >= param) {
					return false;
				}
			} else if ("<=".equals(opt)) {
				if (borderParam > param) {
					return false;
				}
			}
		} else { // 否则为右边界
			if ("<".equals(opt)) {
				if (param >= borderParam) {
					return false;
				}
			} else if ("<=".equals(opt)) {
				if (param > borderParam) {
					return false;
				}
			}
		}
		return true;
	}
}

分享到:
评论

相关推荐

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * \0mnn The character with octal value 0mnn (0 &lt;= m &lt;= 3, 0 &lt;= n &lt;= 7) \0mnn 十进制数 0mnn (0 &lt;= m &lt;= 3, 0 &lt;= n &lt;= 7) * \xhh The character with hexadecimal value 0xhh \xhh 十六进制数 0xhh...

    读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码(还是以支付宝对账单为例)

    在Java中,可以使用`new String(data, "UTF-8")`来解码字节数组。 对于支付宝对账单,它们通常是以CSV或Excel格式存储的,因此在读取内容后,我们还需要解析这些数据。CSV文件可以用逗号分隔,而Excel文件则更复杂...

    java解析DBF源码,修改之后的

    Java解析某些DBF文件时喜欢出错误,错误一:Failed to parse Number: For input string: "-.---" , 错误二:有时候有些被标记为删除的数据读取不出来,这两处我都有修复

    若干个很好的JAVA程序的编写

    if (amount &lt;= 10) { discountRate = 0.1; } else if (amount &lt;= 20) { discountRate = 0.075; } else if (amount &lt;= 40) { discountRate = 0.05; } else if (amount &lt;= 60) { discountRate = 0.03; } else...

    Java开源的xpath解析器Jsoupxpath.zip

    为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发了JsoupXpath。JsoupXpath的实现逻辑清晰,扩展方便,支持几乎全部常用的xpath语法.http://www.cnblogs.com/ 为例 "//a/@href...

    2010年蓝点决赛题+编程练习题(java)

    if (product &gt;= 100 && product &lt;= 999) { int hundreds = product / 100; int tens = (product % 100) / 10; int units = product % 10; if (hundreds % 2 == 1 && tens % 2 == 1 && units % 2 == 1) { ...

    JAVA存储过程详解

    在Java开发中,存储过程是一种预编译并存储在数据库中的SQL脚本或程序,它可以接收参数、执行复杂的逻辑,并返回结果。利用Java来调用存储过程,可以极大地提高应用程序的性能和安全性。下面将对存储过程进行详细的...

    HTMLParser-2.0-SNAPSHOT-bin.zip JAVA html解析库

    Set&lt;String&gt; links = new HashSet&lt;String&gt;(); try { Parser parser = new Parser(url); parser.setEncoding("utf-8"); // 过滤 &lt;frame &gt;标签的 filter,用来提取 frame 标签里的 src 属性所表示的...

    java数组与字符串用法小结

    `StringTokenizer` 是Java中用于解析字符串的一个实用类,它可以按照指定的分隔符将字符串分割成多个部分。下面是一个简单的示例: ```java import java.util.StringTokenizer; public class Test { public ...

    华为OD机试C卷- 分月饼(Java & JS & Python & C).md-私信看全套OD代码及解析

    if (employees == 2 and current_cakes &lt;= cakes // 2 + 3) or \ (employees &gt; 2 and abs(current_cakes - dp[employees - 1][cakes - current_cakes]) &lt;= 3): dp[employees][cakes] += dp[employees - 1][cakes ...

    java获取文件编码(判断有无BOM)

    在Java编程中,处理文件编码是一项常见的任务,特别是在读取、写入或转换文本文件时。文件编码决定了字符集的表示方式,而BOM(Byte Order Mark)则是一种特殊的Unicode标记,用于标识文件的编码类型。本文将详细...

    真题解析│蓝桥杯省赛真题之平方和.pdf

    题目要求在1到2019之间的整数中找出所有包含数字2、0、1、9的整数,并求出这些数字的平方和。 **具体要求如下:** - 找出1至2019之间,所有数位中包含数字2、0、1或9的整数。 - 求这些数字的平方和。 **示例说明...

    oracle存储过程返回多行多列的结构化数组,java调用并解析

    总结来说,本示例展示了如何在Oracle存储过程中定义和使用结构化数组,以及如何在Java中调用这些存储过程并解析返回的多行多列数据。通过这种方式,你可以高效地处理复杂的数据结构,同时利用Java的灵活性来处理这些...

    Java代码常用技巧

    在Java端,为了能够灵活地处理这种复杂的数据结构,可以采用`List&lt;Map&lt;String,List&lt;Map&lt;String,String&gt;&gt;&gt;&gt;`这样的形式。这种多层嵌套的集合结构能够很好地适应不同的数据需求。 - **第一层**:`List`用于存储所有...

    华为OD机试C卷- 最多购买宝石数目(Java & JS & Python & C).md-私信看全套OD代码及解析

    if n == 0 or value == 0: return 0 dp = [[0] * (value + 1) for _ in range(n)] for i in range(n): dp[i][0] = 0 for v in range(1, value + 1): dp[0][v] = 1 if v &gt;= gems[0] else 0 for i in range(1,...

    华为OD机试C卷- 计算疫情扩散时间(Java & JS & Python & C).md-私信看全套OD代码及解析

    if 0 &lt;= new_x &lt; n and 0 &lt;= new_y &lt; n and grid[new_x][new_y] == 0: grid[new_x][new_y] = 1 # 标记为已感染 queue.append((new_x, new_y)) # 加入队列以便后续搜索 days += 1 # 天数加一 # 如果所有区域都...

    siebel JBS代码及CFG JAVA配置

    Siebel JBS(Java Business Service)是一种基于Java的服务组件,它允许开发者在Siebel应用环境中使用Java语言编写业务逻辑。通过这种方式,可以实现与Siebel系统的无缝集成,并利用Java的强大功能进行复杂的业务...

    JAVA8新特性各种用法详解

    本文将详细解析Java 8新特性中的几个关键点,包括Lambda表达式的使用、内置函数式接口的介绍以及如何利用这些接口进行高效编程。 #### 二、Lambda表达式与访问接口的默认方法 **Lambda表达式**是一种简洁的方法来...

    sql的封装,不需要使用StringBuffer进行字符串拼接

    首先,`StringBuffer`或`StringBuilder`在Java中用于构建可变字符串,它们在循环中拼接字符串时比直接使用`+`操作符更有效率。然而,这种字符串拼接方式在处理大量数据或者频繁拼接时,容易导致内存开销过大,因为...

Global site tag (gtag.js) - Google Analytics