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 李 明 閱讀(424) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 宁城县| 巴青县| 澳门| 无棣县| 英德市| 汶川县| 定西市| 临夏县| 清新县| 山西省| 前郭尔| 宜宾市| 巴东县| 南昌县| 汉阴县| 云南省| 宜兴市| 哈巴河县| 班戈县| 青冈县| 昌宁县| 扎兰屯市| 弥渡县| 灯塔市| 政和县| 台南市| 临汾市| 龙海市| 隆安县| 淳化县| 盐池县| 双牌县| 咸宁市| 桐梓县| 那曲县| 阆中市| 长沙县| 济阳县| 龙游县| 丰城市| 三都|