ALL is Well!

敏捷是一条很长的路,摸索着前进着

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 23 文章 :: 71 评论 :: 0 Trackbacks

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

----2008年11月25日
posted on 2010-09-01 10:56 李 明 阅读(417) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: