ccf-csp 1912-3 化学方程式(Java)

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String testExp = "2H2+O2=2H2O";
		new h32().isEqualFormula(testExp);

	}

	public Boolean isEqualFormula(String s) {
		//判断等号左右的表达式是否等价
		s = deleteBractet(s);
		String[] md = s.split("=");
		String left_str = md[0];
		String right_str = md[1];
		Map<String, Integer> left_atom = analyzeItems(left_str);
		Map<String, Integer> right_atom = analyzeItems(right_str);
		if (left_atom.equals(right_atom)) {
			System.out.println("Y");
			return true;
		} else {
			System.out.println("N");
			return false;
		}

	}

	public Map<String, Integer> analyzeItems(String s) {
		//处理等号的一侧
		Map<String, Integer> map = new HashMap<>();
		if (!s.contains("+")) {
			map = analyseItem(s, map);
		} else {
			for (String e : s.split("\\+")) {
				map = analyseItem(e, map);

			}
		}
		return map;
	}

	public Map<String, Integer> analyseItem(String e, Map<String, Integer> map) {
		//对由"+"分割开的项进行处理
		char[] arr = e.toCharArray();
		String element = null;
		int multipy = 1;
		for (int i = arr.length - 1; i >= 0; i--) {
			if ('A' <= arr[i] && arr[i] <= 'Z') {
				if (i != arr.length - 1 && 'a' <= arr[i + 1] && arr[i + 1] <= 'z') {
					element = e.substring(i, i + 2);
					if (map.containsKey(element))
						map.put(element, (map.get(element) + 1) * multipy);
					else
						map.put(element, 1 * multipy);
				} else {
					element = e.substring(i, i + 1);
					if (map.containsKey(element))
						map.put(element, (map.get(element) + 1) * multipy);
					else
						map.put(element, 1 * multipy);
				}
				multipy = 1;

			} else if ('0' < arr[i] && arr[i] <= '9')
				multipy = arr[i] - '0';
			else {
				multipy = 1;
				continue;
			}
		}
		if (multipy != 1) {
			for (String m : map.keySet()) {
				map.put(m, map.get(m) * multipy);
			}
		}
		return map;
	}

	public String deleteBractet(String s) {
//		将含括号的表达式等价转换为不含括号的表达式
		Pattern p = Pattern.compile("\\(\\w*\\)\\d");// 正则匹配后面紧邻一数字的括号
		int length = 0;
		int numberAppend = 0;// 括号后面紧邻的数字
		String str = null;
		StringBuilder sb = new StringBuilder();
		while (s.contains("(")) {
			Matcher m = p.matcher(s);
			if (m.find()) {
				length = m.group().length();
				numberAppend = m.group().charAt(length - 1) - '0';
				if (0 < numberAppend && numberAppend <= 9) {
					str = m.group().substring(1, length - 2);
					sb = new StringBuilder(str);
					for (int i = 0; i < numberAppend - 1; i++) {
						sb.append(str);
					}
					str = sb.toString();
					s = s.replace(m.group(), str);
				}
			}
		}
		return s;
	}
}

你可能感兴趣的:(Java,csp)