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;
}
}