Windchill 位号校验工具类


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * 位号校验
 * 
 * @author tyt 位号不能是中划线和逗号结尾
 */
public class CtCheckFitPlaceTool {
//	CtCheckFitPlaceTool.checkFitPlace2Num
//	CtCheckFitPlaceTool.isInteger
	public static void main(String[] args) {
		// 26
//		String str = "C108,C108,C12A002-C12A003,C1209,C10216-C10217,C1233,C1302,C1309-C1310,C1312,C1800-C1803,C1808,C1900-C1904,C1906-C1908,C1914,C2206";
//		String str = "R0511-R511";
		String str = "R19-R21,R23-R24,R26-R29,R31-R32,R37-R46,R52,R323-R327,R405,R411-R412,R415,R421-R423,R426,R500-R511,R511-R529,R533-R541,R545-R571,R600-R601,R604,R609-R610,R613-R614,R617,R619-R620,R650,R708,R802";
		List<String> list = new ArrayList<String>();
		System.out.println(checkFitPlace2NumAndList(str, list));
		System.out.println(list.size());
		Set set = new HashSet(list);
		System.out.println(set.size());
		if (list.size() != set.size()) {
			List<String> result = new ArrayList<String>(set);
			System.out.println(getIntersection(list, result));// 取相同
			System.out.println(getCheckData(list));// 取重复
		}
	}

	/**
	 * 统计位号数量和拆分后的位号数组
	 * 
	 * @param str
	 * @param list
	 * @return
	 */
	public static String checkFitPlace2NumAndList(String str, List<String> list) {
		checkStr(str);// 位号不能是中划线和逗号结尾
		String[] strs = str.split(",");
		int sum = 0;
		for (String fit : strs) {
			if (fit.contains("-")) {
				String i = splitStr(fit, list); // 返回的不是数字就算错误信息
				if (isInteger(i)) {
					sum += Integer.valueOf(i);
				} else {
//					list.clear(); // 按需求决定
					return i;
				}
			} else {
				list.add(fit);// A.记录值
				sum++;
			}
		}
//		System.out.println("总条数: " + sum);
		return sum + "";
	}

	private static boolean checkStr(String strs) {
		// 位号不能是中划线和逗号结尾
		boolean fal = true;
		if (strs.startsWith(",") || strs.startsWith("-") || strs.endsWith(",") || strs.endsWith("-")) {
			System.out.println("位号不能是中划线或逗号结尾");
			fal = false;
		}
		return fal;
	}

	/**
	 * 校验位号输入的正确与否,并且记录拆分后的位号
	 * 
	 * @param str
	 * @param list
	 * @return
	 */
	private static String splitStr(String str, List<String> list) {
		String error = "位号的值 '" + str + "' 无效。字符 '-' 和 ',' 已被保留,而且不能作为位号的一部分来使用,除非位号以 '[' 开始并以']'.结束。";
		if (str.startsWith("[") && str.endsWith("]")) { // [C1-CC1],此类当一个位号处理
			list.add(str);// B.记录值
			return "1";
		} else {
			if (checkStr(str) && isUniqueChars(str, '-')) { // A.不能以逗号和中划线开头和结尾 B.不能包含多个中划线
				String[] strs = str.split("-");
				String start = strs[0]; // eg: C1
				String end = strs[1]; // eg: C2
				String startResult = getStartStr(start); // 截取字符串后面的字符串
				String endResult = getStartStr(end);
				if (startResult.equals(endResult)) {
					start = start.replace(startResult, "");
					end = end.replace(endResult, "");
					if (isInteger(start) && isInteger(end)) {// 判断是否是数字类型
						int s = Integer.valueOf(start);
						int e = Integer.valueOf(end);
						if (s < e) {
							int i = ((e - s) + 1);
							for (int n = 0; n < i; n++) {
								list.add(startResult + (s + n));// C.记录值
							}
							return "" + i;// eg: 2-12个位号,实际数字应该是11个位号
						} else {
							return error;
						}
					} else {
						return error;
					}
				} else {
					return error;
				}
			} else {
				return error;
			}
		}
	}

	/**
	 * 判断出现几次
	 * 
	 * @param str
	 * @param mark
	 * @return
	 */
	private static boolean isUniqueChars(String str, char mark) {
		char[] chars = str.toCharArray();
		int i = 0;
		for (char c : chars) {
			if (c == mark) {
				i++;
			}
		}
		if (i > 1) {
			return false;
		}
		return true;
	}

	/**
	 * 判断是否是数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isInteger(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 截取字符串后面的字符串
	 * 
	 * @param startAndEnd
	 * @return
	 */
	public static String getStartStr(String startAndEnd) {
		String result = "";
		int j = 0;
		int t = 0;
		for (int i = startAndEnd.length(); --i >= 0;) { // 从后面往前面找
			String chr = String.valueOf(startAndEnd.charAt(i));
			if (!isInteger(chr)) {
				j = i;
				break;
			} else {
				if ("0".equals(chr)) { // 截取 EG:C001 ---> 1 ,如果不写该判断,则最终是 001,转为int 是1, list统计位号时候,需要补0才行
					t++;
				} else {
					t = 0;
				}
			}
		}
		result = startAndEnd.substring(0, (j + t + 1));
		return result;
	}

	/**
	 * 两个取出相同的数据
	 * 
	 * @param list1
	 * @param list2
	 * @return
	 */
	public static List<String> getIntersection(List<String> list1, List<String> list2) {
		List<String> result = new ArrayList<String>();
		for (String str : list2) {// 遍历list1
			if (list1.contains(str)) {
				result.add(str);
			}
		}
		return result;
	}

	/**
	 * 取出当前List的重复数据
	 * 
	 * @param list1
	 * @param list2
	 * @return
	 */
	public static List<String> getCheckData(List<String> list1) {
		List<String> result = new ArrayList<String>();
		Collections.sort(list1); // 先排序,再判断重复数据
		 // 反转
        //Collections.reverse(list);
		String backStr="";
		for (String str : list1) {// 遍历list1
			if (backStr.equals(str)) {
				result.add(str);
			}
			backStr=str;
		}
		return result;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值