今天在CSDN看到一个笔试题,觉得蛮有意思的,
题目如下:
从事先写好的Input.txt文件中读取数,
Input.txt 内容
A{13,2,1,20,30,50}
B{1,2,34,5,6}
C{2,3,12,23,14,11}
用户在键盘随意敲入...例如((A*B))+B-C,((C+B)*A)-B期中+,*,-,分别代表集合的并交差运算,控制台打印输出。
开始的时候打算用栈来计算的,
但想了想,不会搞,还是来个笨方法吧。
废话不多说,贴代码。
代码写的很烂,汗了!
- /**
- * 从事先写好的Input.txt文件中读取数,
- * Input.txt 内容
- * A{13,2,1,20,30,50}
- * B{1,2,34,5,6}
- * C{2,3,12,23,14,11}
- * 用户在键盘随意敲入...例如((A*B))+B-C,((C+B)*A)-B期中+,*,-,分别代表集合的并交差运算,控制台打印输出。
- */
- package com.lim.test;
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author bzwm
- *
- */
- public class EditorString {
- private Type a = null;
- private Type b = null;
- private Type c = null;
- private Type t = null;
- /**
- * 读入指定的文件
- *
- * @param path
- */
- public void readFile(String path) {
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new InputStreamReader(
- new FileInputStream(path)));
- String str = null;
- while ((str = reader.readLine()) != null) {
- if (str.substring(0, 1).equals("A")) {
- a = new Type(str);
- } else if (str.substring(0, 1).equals("B")) {
- b = new Type(str);
- } else if (str.substring(0, 1).equals("C")) {
- c = new Type(str);
- } else if (str.substring(0, 1).equals("T")) {
- t = new Type(str);
- } else {
- System.out.println("no such type!");
- return;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- return;
- }
- }
- /**
- * 处理并、交、差操作,显示结果
- *
- * @param rule
- */
- public void displayResult(String rule) {
- int start = 0;
- int end = 0;
- while (rule.length() > 2) {
- if (rule.contains("(")) {
- start = rule.lastIndexOf("(");
- end = start + 4;
- rule = execute(start, end, rule);
- } else {
- start = 0;
- end = start + 2;
- rule = executeNormal(start, end, rule);
- }
- }
- List result = t.getArray();
- for (int i = 0; i < result.size(); i++)
- System.out.println(result.get(i));
- }
- /**
- * 处理并、交、差操作
- *
- * @param start
- * @param end
- * @param rule
- * @return rule
- */
- private String execute(int start, int end, String rule) {
- int size = rule.length();
- Type obj = typeFactory(rule.substring(start + 1, start + 2));
- String ope = rule.substring(start + 2, start + 3);
- Type arg = typeFactory(rule.substring(end - 1, end));
- try {
- t = execute(obj, arg, ope);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return rule.substring(0, start) + "T" + rule.substring(end + 1, size);
- }
- /**
- * 当用户输入的rule没有括号的情况:处理并、交、差操作
- * @param start
- * @param end
- * @param rule
- * @return rule
- */
- private String executeNormal(int start, int end, String rule) {
- int size = rule.length();
- Type obj = typeFactory(rule.substring(start, start + 1));
- String ope = rule.substring(start + 1, start + 2);
- Type arg = typeFactory(rule.substring(end, end + 1));
- try {
- t = execute(obj, arg, ope);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return rule.substring(0, start) + "T" + rule.substring(end + 1, size);
- }
- /**
- * 根据ope的不同,调用不同的方法
- *
- * @param obj
- * @param arg
- * @param ope
- * @return
- * @throws SecurityException
- * @throws NoSuchMethodException
- * @throws IllegalArgumentException
- * @throws IllegalAccessException
- * @throws InvocationTargetException
- */
- private Type execute(Type obj, Type arg, String ope)
- throws SecurityException, NoSuchMethodException,
- IllegalArgumentException, IllegalAccessException,
- InvocationTargetException {
- Class c = obj.getClass();
- Class[] args = new Class[1];
- args[0] = arg.getClass();
- Method m = null;
- if (ope.equals("+")) {
- m = c.getMethod("bing", args);
- } else if (ope.equals("*")) {
- m = c.getMethod("jiao", args);
- } else if (ope.equals("-")) {
- m = c.getMethod("cha", args);
- } else {
- System.out.println("NoSuchMethod");
- return null;
- }
- return (Type) m.invoke(obj, new Object[] { arg });
- }
- /**
- * 读入用户输入的匹配规则 如:((C+B)*A)-B
- *
- * @return
- */
- public static String readInput() {
- String ret = null;
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- try {
- ret = br.readLine();
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- return ret;
- }
- /**
- * 构造工厂
- *
- * @param type
- * @return
- */
- private Type typeFactory(String type) {
- if (type.equals("A")) {
- return new Type(a.getArray());
- } else if (type.equals("B")) {
- return new Type(b.getArray());
- } else if (type.equals("C")) {
- return new Type(c.getArray());
- } else if (type.equals("T")) {
- return new Type(t.getArray());
- } else {
- return null;
- }
- }
- /**
- * 把如{13,2,1,20,30,50}的集合抽象成一个类,提供并、交、差操作
- *
- * @author bzwm
- *
- */
- class Type {
- private List array = new ArrayList();
- public Type(String srt) {
- this.array = createList(srt);
- }
- public Type(List list) {
- this.array.addAll(list);
- }
- public List getArray() {
- return this.array;
- }
- /**
- * 并操作
- *
- * @param arg
- * @return
- */
- public Type bing(Type arg) {
- // 是否加入到集合中的标志
- boolean add = true;
- // 取出传入的Type对象的List
- List list = arg.getArray();
- // 遍历传入的Type对象的List
- for (int i = 0; i < list.size(); i++) {
- add = true;
- // 与array里的值一一进行比较,如果全都不等,则加入到原array中,否则不加入
- for (int j = 0; j < array.size(); j++) {
- if (((Integer) list.get(i)).intValue() == ((Integer) array
- .get(j)).intValue()) {
- add = false;
- }
- }
- if (add) {
- array.add(list.get(i));
- }
- }
- // 返回新的Type对象
- return new Type(array);
- }
- /**
- * 交操作
- *
- * @param arg
- * @return
- */
- public Type jiao(Type arg) {
- // 是否加入到集合中的标志
- boolean add = false;
- // 存放交集数据的List
- List ret = new ArrayList();
- // 取出传入的Type对象的List
- List list = arg.getArray();
- // 遍历传入的Type对象的List
- for (int i = 0; i < list.size(); i++) {
- add = false;
- // 与array里的值一一进行比较,如果有相等的,则加入到ret中,否则不加入
- for (int j = 0; j < array.size(); j++) {
- if (((Integer) list.get(i)).intValue() == ((Integer) array
- .get(j)).intValue()) {
- add = true;
- }
- }
- if (add) {
- ret.add(list.get(i));
- }
- }
- // 返回新的Type对象
- return new Type(ret);
- }
- /**
- * 差操作
- *
- * @param arg
- * @return
- */
- public Type cha(Type arg) {
- // 是否加入到集合中的标志
- boolean add = true;
- // 存放交集数据的List
- List list = arg.getArray();
- // 遍历传入的Type对象的List
- for (int i = 0; i < list.size(); i++) {
- add = true;
- // 与array里的值一一进行比较,如果有相等的,则从原array中将其删除,如果全都不等,则加入到原array中
- for (int j = 0; j < array.size(); j++) {
- if (((Integer) list.get(i)).intValue() == ((Integer) array
- .get(j)).intValue()) {
- add = false;
- // 删除相等的数据
- array.remove(j);
- }
- }
- if (add) {
- array.add(list.get(i));
- }
- }
- // 返回新的Type对象
- return new Type(array);
- }
- /**
- * 解析字符串,将数字加入到List中
- *
- * @param str
- * @return
- */
- private List createList(String str) {
- // 将字符串解析成字符串数组A{13,2,1,20,30,50}-->new String[]{13,2,1,20,30,50}
- String s[] = str.replaceAll(str.substring(0, 1), "").replace("{",
- "").replace("}", "").split(",");
- List list = new ArrayList();
- for (int i = 0; i < s.length; i++) {
- list.add(new Integer(s[i]));
- }
- return list;
- }
- }
- /**
- * 测试程序
- * @param args
- */
- public static void main(String args[]) {
- EditorString es = new EditorString();
- es.readFile("input.txt");
- es.displayResult(readInput());//((C+B)*A)-B
- }
- }
写完这个程序之后,该睡觉了,也没测试!
有问题了再说啊!