在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;
	}
}
时间: 2024-11-08 01:29:42

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

Java中的String为什么是不可变的?

转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于J

Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的. 不能改变状态的意思是:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 2. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: 1 String s =

java 中的String类型

java 中的String类型   (1)String类型的数据可以表示所有的数据类型. (2)String中的字符串常量与一般的字符串:                String str0 = "hello";//字符串常量“hello”被预先放到了数据段的字符串常量池中                String str1 = "hello";//直接从常量池中寻找已有的字符串常量                String str2 = new String

Java中与String有关的且不得不说的事

如果以下有与Java堆栈和JVM常量池有关的可以访问下面的连接 Java当中的堆与栈详细解析 JVM中的常量池解析 前期记得自己学习编程语言的时候,只要能写出代码就可以.编程语言不就是写程序的吗?自己报着这种目的性很强的心态去学习,忽略了其中的精彩部分,学完C++之间学Java感觉Java中的String和C++中的没有什么区别,都是能存储大小随意变化的字符串. 如:String s="12345"; s  = "0";如果是字符串数组的话那就不,感觉很方便很好用.

Java中的String为什么是不可变的?

原文:张纪刚 链接:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象

String源码分析之Java中的String为什么是不可变的以及replace方法源码分析

什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: String s = "ABCabc";

Java中的String为什么是不可变的? -- String源码分析

转:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于Ja

Java 中的 String 为什么是不可变的?(转)

什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括 基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: String s = "ABCabc";

[转]为什么Java中的String不可变

笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int.boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在. 但是稍有研究的人就会发现,String对象是不可修改的,源代码中的String类被定义为final,即为终态,不可继承,String也不提供任何直接修改对象内部值的方法,每次使用replace.substring.trim等方法,或是使用字符串连接符+时,都是返回一个全新的String对象,整个Stri