一道笔试题:按照用户输入的rule,经过并、交、差运算后,输出字符串结果。

今天在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期中+,*,-,分别代表集合的并交差运算,控制台打印输出。

 

开始的时候打算用栈来计算的,

但想了想,不会搞,还是来个笨方法吧。

废话不多说,贴代码。

代码写的很烂,汗了!

 

  1. /**
  2.  * 从事先写好的Input.txt文件中读取数, 
  3.  *  Input.txt 内容 
  4.  *  A{13,2,1,20,30,50} 
  5.  *  B{1,2,34,5,6} 
  6.  *  C{2,3,12,23,14,11} 
  7.  *  用户在键盘随意敲入...例如((A*B))+B-C,((C+B)*A)-B期中+,*,-,分别代表集合的并交差运算,控制台打印输出。
  8.  */
  9. package com.lim.test;
  10. import java.io.BufferedReader;
  11. import java.io.FileInputStream;
  12. import java.io.IOException;
  13. import java.io.InputStreamReader;
  14. import java.lang.reflect.InvocationTargetException;
  15. import java.lang.reflect.Method;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. /**
  19.  * @author bzwm
  20.  * 
  21.  */
  22. public class EditorString {
  23.     private Type a = null;
  24.     private Type b = null;
  25.     private Type c = null;
  26.     private Type t = null;
  27.     /**
  28.      * 读入指定的文件
  29.      * 
  30.      * @param path
  31.      */
  32.     public void readFile(String path) {
  33.         BufferedReader reader = null;
  34.         try {
  35.             reader = new BufferedReader(new InputStreamReader(
  36.                     new FileInputStream(path)));
  37.             String str = null;
  38.             while ((str = reader.readLine()) != null) {
  39.                 if (str.substring(0, 1).equals("A")) {
  40.                     a = new Type(str);
  41.                 } else if (str.substring(0, 1).equals("B")) {
  42.                     b = new Type(str);
  43.                 } else if (str.substring(0, 1).equals("C")) {
  44.                     c = new Type(str);
  45.                 } else if (str.substring(0, 1).equals("T")) {
  46.                     t = new Type(str);
  47.                 } else {
  48.                     System.out.println("no such type!");
  49.                     return;
  50.                 }
  51.             }
  52.         } catch (Exception e) {
  53.             e.printStackTrace();
  54.             return;
  55.         }
  56.     }
  57.     /**
  58.      * 处理并、交、差操作,显示结果
  59.      * 
  60.      * @param rule
  61.      */
  62.     public void displayResult(String rule) {
  63.         int start = 0;
  64.         int end = 0;
  65.         while (rule.length() > 2) {
  66.             if (rule.contains("(")) {
  67.                 start = rule.lastIndexOf("(");
  68.                 end = start + 4;
  69.                 rule = execute(start, end, rule);
  70.             } else {
  71.                 start = 0;
  72.                 end = start + 2;
  73.                 rule = executeNormal(start, end, rule);
  74.             }
  75.         }
  76.         List result = t.getArray();
  77.         for (int i = 0; i < result.size(); i++)
  78.             System.out.println(result.get(i));
  79.     }
  80.     /**
  81.      * 处理并、交、差操作
  82.      * 
  83.      * @param start
  84.      * @param end
  85.      * @param rule
  86.      * @return rule
  87.      */
  88.     private String execute(int start, int end, String rule) {
  89.         int size = rule.length();
  90.         Type obj = typeFactory(rule.substring(start + 1, start + 2));
  91.         String ope = rule.substring(start + 2, start + 3);
  92.         Type arg = typeFactory(rule.substring(end - 1, end));
  93.         try {
  94.             t = execute(obj, arg, ope);
  95.         } catch (Exception e) {
  96.             e.printStackTrace();
  97.         }
  98.         return rule.substring(0, start) + "T" + rule.substring(end + 1, size);
  99.     }
  100.     /**
  101.      * 当用户输入的rule没有括号的情况:处理并、交、差操作
  102.      * @param start
  103.      * @param end
  104.      * @param rule
  105.      * @return rule
  106.      */
  107.     private String executeNormal(int start, int end, String rule) {
  108.         int size = rule.length();
  109.         Type obj = typeFactory(rule.substring(start, start + 1));
  110.         String ope = rule.substring(start + 1, start + 2);
  111.         Type arg = typeFactory(rule.substring(end, end + 1));
  112.         try {
  113.             t = execute(obj, arg, ope);
  114.         } catch (Exception e) {
  115.             e.printStackTrace();
  116.         }
  117.         return rule.substring(0, start) + "T" + rule.substring(end + 1, size);
  118.     }
  119.     /**
  120.      * 根据ope的不同,调用不同的方法
  121.      * 
  122.      * @param obj
  123.      * @param arg
  124.      * @param ope
  125.      * @return
  126.      * @throws SecurityException
  127.      * @throws NoSuchMethodException
  128.      * @throws IllegalArgumentException
  129.      * @throws IllegalAccessException
  130.      * @throws InvocationTargetException
  131.      */
  132.     private Type execute(Type obj, Type arg, String ope)
  133.             throws SecurityException, NoSuchMethodException,
  134.             IllegalArgumentException, IllegalAccessException,
  135.             InvocationTargetException {
  136.         Class c = obj.getClass();
  137.         Class[] args = new Class[1];
  138.         args[0] = arg.getClass();
  139.         Method m = null;
  140.         if (ope.equals("+")) {
  141.             m = c.getMethod("bing", args);
  142.         } else if (ope.equals("*")) {
  143.             m = c.getMethod("jiao", args);
  144.         } else if (ope.equals("-")) {
  145.             m = c.getMethod("cha", args);
  146.         } else {
  147.             System.out.println("NoSuchMethod");
  148.             return null;
  149.         }
  150.         return (Type) m.invoke(obj, new Object[] { arg });
  151.     }
  152.     /**
  153.      * 读入用户输入的匹配规则 如:((C+B)*A)-B
  154.      * 
  155.      * @return
  156.      */
  157.     public static String readInput() {
  158.         String ret = null;
  159.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  160.         try {
  161.             ret = br.readLine();
  162.         } catch (IOException e) {
  163.             e.printStackTrace();
  164.             return null;
  165.         }
  166.         return ret;
  167.     }
  168.     /**
  169.      * 构造工厂
  170.      * 
  171.      * @param type
  172.      * @return
  173.      */
  174.     private Type typeFactory(String type) {
  175.         if (type.equals("A")) {
  176.             return new Type(a.getArray());
  177.         } else if (type.equals("B")) {
  178.             return new Type(b.getArray());
  179.         } else if (type.equals("C")) {
  180.             return new Type(c.getArray());
  181.         } else if (type.equals("T")) {
  182.             return new Type(t.getArray());
  183.         } else {
  184.             return null;
  185.         }
  186.     }
  187.     /**
  188.      * 把如{13,2,1,20,30,50}的集合抽象成一个类,提供并、交、差操作
  189.      * 
  190.      * @author bzwm
  191.      * 
  192.      */
  193.     class Type {
  194.         private List array = new ArrayList();
  195.         public Type(String srt) {
  196.             this.array = createList(srt);
  197.         }
  198.         public Type(List list) {
  199.             this.array.addAll(list);
  200.         }
  201.         public List getArray() {
  202.             return this.array;
  203.         }
  204.         /**
  205.          * 并操作
  206.          * 
  207.          * @param arg
  208.          * @return
  209.          */
  210.         public Type bing(Type arg) {
  211.             // 是否加入到集合中的标志
  212.             boolean add = true;
  213.             // 取出传入的Type对象的List
  214.             List list = arg.getArray();
  215.             // 遍历传入的Type对象的List
  216.             for (int i = 0; i < list.size(); i++) {
  217.                 add = true;
  218.                 // 与array里的值一一进行比较,如果全都不等,则加入到原array中,否则不加入
  219.                 for (int j = 0; j < array.size(); j++) {
  220.                     if (((Integer) list.get(i)).intValue() == ((Integer) array
  221.                             .get(j)).intValue()) {
  222.                         add = false;
  223.                     }
  224.                 }
  225.                 if (add) {
  226.                     array.add(list.get(i));
  227.                 }
  228.             }
  229.             // 返回新的Type对象
  230.             return new Type(array);
  231.         }
  232.         /**
  233.          * 交操作
  234.          * 
  235.          * @param arg
  236.          * @return
  237.          */
  238.         public Type jiao(Type arg) {
  239.             // 是否加入到集合中的标志
  240.             boolean add = false;
  241.             // 存放交集数据的List
  242.             List ret = new ArrayList();
  243.             // 取出传入的Type对象的List
  244.             List list = arg.getArray();
  245.             // 遍历传入的Type对象的List
  246.             for (int i = 0; i < list.size(); i++) {
  247.                 add = false;
  248.                 // 与array里的值一一进行比较,如果有相等的,则加入到ret中,否则不加入
  249.                 for (int j = 0; j < array.size(); j++) {
  250.                     if (((Integer) list.get(i)).intValue() == ((Integer) array
  251.                             .get(j)).intValue()) {
  252.                         add = true;
  253.                     }
  254.                 }
  255.                 if (add) {
  256.                     ret.add(list.get(i));
  257.                 }
  258.             }
  259.             // 返回新的Type对象
  260.             return new Type(ret);
  261.         }
  262.         /**
  263.          * 差操作
  264.          * 
  265.          * @param arg
  266.          * @return
  267.          */
  268.         public Type cha(Type arg) {
  269.             // 是否加入到集合中的标志
  270.             boolean add = true;
  271.             // 存放交集数据的List
  272.             List list = arg.getArray();
  273.             // 遍历传入的Type对象的List
  274.             for (int i = 0; i < list.size(); i++) {
  275.                 add = true;
  276.                 // 与array里的值一一进行比较,如果有相等的,则从原array中将其删除,如果全都不等,则加入到原array中
  277.                 for (int j = 0; j < array.size(); j++) {
  278.                     if (((Integer) list.get(i)).intValue() == ((Integer) array
  279.                             .get(j)).intValue()) {
  280.                         add = false;
  281.                         // 删除相等的数据
  282.                         array.remove(j);
  283.                     }
  284.                 }
  285.                 if (add) {
  286.                     array.add(list.get(i));
  287.                 }
  288.             }
  289.             // 返回新的Type对象
  290.             return new Type(array);
  291.         }
  292.         /**
  293.          * 解析字符串,将数字加入到List中
  294.          * 
  295.          * @param str
  296.          * @return
  297.          */
  298.         private List createList(String str) {
  299.             // 将字符串解析成字符串数组A{13,2,1,20,30,50}-->new String[]{13,2,1,20,30,50}
  300.             String s[] = str.replaceAll(str.substring(0, 1), "").replace("{",
  301.                     "").replace("}""").split(",");
  302.             List list = new ArrayList();
  303.             for (int i = 0; i < s.length; i++) {
  304.                 list.add(new Integer(s[i]));
  305.             }
  306.             return list;
  307.         }
  308.     }
  309.     /**
  310.      * 测试程序
  311.      * @param args
  312.      */
  313.     public static void main(String args[]) {
  314.         EditorString es = new EditorString();
  315.         es.readFile("input.txt");
  316.         es.displayResult(readInput());//((C+B)*A)-B
  317.     }
  318. }

写完这个程序之后,该睡觉了,也没测试!

有问题了再说啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值