/**
* 提取中括号中内容,忽略中括号中的中括号
*
* @param msg
* @return
*/
public static List<String> extractCode(String msg) {
List<String> list = new ArrayList<String>();
int start = 0;
int startFlag = 0;
int endFlag = 0;
for (int i = 0; i < msg.length(); i++) {
if (msg.charAt(i) == '[') {
startFlag++;
if (startFlag == endFlag + 1) {
start = i;
}
} else if (msg.charAt(i) == ']') {
endFlag++;
if (endFlag == startFlag) {
list.add(msg.substring(start + 1, i));
}
}
}
return list;
}
public static void main(String[] args) {
Map<String,String> targetMap = new HashMap<String,String>();
setMap(targetMap, "R1", "[R3]+[R4]");
//setMap(targetMap, "R1", "[R1]");
//targetMap.put("R1", extractCode("[R1]"));
setMap(targetMap, "R3", "([R1]+[R9])*3");
setMap(targetMap, "R3", "([R8]+[R9])*3");
setMap(targetMap, "R8", "[R1]");
System.out.println(targetMap);
StringBuffer msg = new StringBuffer();
isExpressionFor(targetMap, msg);
}
public static void setMap(Map<String,String> targetMap,String key,String values){
Map<String,String> targetMapNew = new HashMap<String, String>();
Iterator<Entry<String, String>> iterator = targetMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<java.lang.String,java.lang.String> entry = (Map.Entry<java.lang.String,java.lang.String>) iterator.next();
List<String> vs = extractCode(entry.getValue());
String value = entry.getValue();
boolean con = false;
for (String z : vs) {
if(!equals(z,key)){
continue;
}
con = true;
value = StringUtils.replace(value,"["+key+"]", values);
}
if(con){
targetMapNew.put(entry.getKey()+"_"+System.currentTimeMillis(), value);
}
}
targetMap.putAll(targetMapNew);
targetMap.put(key, values);
}
/**
* 判断是否存在循环引用的公式
* @param targetMap
*/
public static boolean isExpressionFor(Map<String,String> targetMap,StringBuffer msg) {
boolean isBreak = false;
//判断是否有循环引用的公式
Iterator<Entry<String, String>> iterator = targetMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String,String> entry = (Map.Entry<String,String>) iterator.next();
String key = entry.getKey().split("_",-1)[0];
List<String> expressList = extractCode(entry.getValue());
for (String val : expressList) {
StringBuffer bfExpress = new StringBuffer();
if (isForExpression(key, val, expressList, targetMap, bfExpress)) {
System.out.println("存在循环引用公式:" + key + " = "+ entry.getValue() + " -> "+ bfExpress.toString());
msg.append("存在循环引用公式:" + key + " = "+ entry.getValue() + " -> "+ bfExpress.toString());
isBreak = true;
break;
}
}
if(isBreak){
break;
}
}
return isBreak;
}
public static boolean isForExpression(String sourceKey,String sourceValue,List<String> sourceExpressList,Map<String,String> targetMap,StringBuffer bfExpress) {
Iterator<Entry<String, String>> iteratorSubset = targetMap.entrySet().iterator();
while (iteratorSubset.hasNext()) {
Map.Entry<String,String> entrySubset = (Map.Entry<String,String>) iteratorSubset.next();
String key = entrySubset.getKey().split("_",-1)[0];
List<String> expressList = extractCode(entrySubset.getValue());
for (String val : expressList) {
if(StringUtils.equals(sourceKey, val) && sourceExpressList.contains(key)){
bfExpress.append(key);
bfExpress.append("=");
bfExpress.append(entrySubset.getValue());
return true;
}
}
}
return false;
}