`

一道笔试题:按照用户输入的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. packagecom.lim.test;
  10. importjava.io.BufferedReader;
  11. importjava.io.FileInputStream;
  12. importjava.io.IOException;
  13. importjava.io.InputStreamReader;
  14. importjava.lang.reflect.InvocationTargetException;
  15. importjava.lang.reflect.Method;
  16. importjava.util.ArrayList;
  17. importjava.util.List;
  18. /**
  19. *@authorbzwm
  20. *
  21. */
  22. publicclassEditorString{
  23. privateTypea=null;
  24. privateTypeb=null;
  25. privateTypec=null;
  26. privateTypet=null;
  27. /**
  28. *读入指定的文件
  29. *
  30. *@parampath
  31. */
  32. publicvoidreadFile(Stringpath){
  33. BufferedReaderreader=null;
  34. try{
  35. reader=newBufferedReader(newInputStreamReader(
  36. newFileInputStream(path)));
  37. Stringstr=null;
  38. while((str=reader.readLine())!=null){
  39. if(str.substring(0,1).equals("A")){
  40. a=newType(str);
  41. }elseif(str.substring(0,1).equals("B")){
  42. b=newType(str);
  43. }elseif(str.substring(0,1).equals("C")){
  44. c=newType(str);
  45. }elseif(str.substring(0,1).equals("T")){
  46. t=newType(str);
  47. }else{
  48. System.out.println("nosuchtype!");
  49. return;
  50. }
  51. }
  52. }catch(Exceptione){
  53. e.printStackTrace();
  54. return;
  55. }
  56. }
  57. /**
  58. *处理并、交、差操作,显示结果
  59. *
  60. *@paramrule
  61. */
  62. publicvoiddisplayResult(Stringrule){
  63. intstart=0;
  64. intend=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. Listresult=t.getArray();
  77. for(inti=0;i<result.size();i++)
  78. System.out.println(result.get(i));
  79. }
  80. /**
  81. *处理并、交、差操作
  82. *
  83. *@paramstart
  84. *@paramend
  85. *@paramrule
  86. *@returnrule
  87. */
  88. privateStringexecute(intstart,intend,Stringrule){
  89. intsize=rule.length();
  90. Typeobj=typeFactory(rule.substring(start+1,start+2));
  91. Stringope=rule.substring(start+2,start+3);
  92. Typearg=typeFactory(rule.substring(end-1,end));
  93. try{
  94. t=execute(obj,arg,ope);
  95. }catch(Exceptione){
  96. e.printStackTrace();
  97. }
  98. returnrule.substring(0,start)+"T"+rule.substring(end+1,size);
  99. }
  100. /**
  101. *当用户输入的rule没有括号的情况:处理并、交、差操作
  102. *@paramstart
  103. *@paramend
  104. *@paramrule
  105. *@returnrule
  106. */
  107. privateStringexecuteNormal(intstart,intend,Stringrule){
  108. intsize=rule.length();
  109. Typeobj=typeFactory(rule.substring(start,start+1));
  110. Stringope=rule.substring(start+1,start+2);
  111. Typearg=typeFactory(rule.substring(end,end+1));
  112. try{
  113. t=execute(obj,arg,ope);
  114. }catch(Exceptione){
  115. e.printStackTrace();
  116. }
  117. returnrule.substring(0,start)+"T"+rule.substring(end+1,size);
  118. }
  119. /**
  120. *根据ope的不同,调用不同的方法
  121. *
  122. *@paramobj
  123. *@paramarg
  124. *@paramope
  125. *@return
  126. *@throwsSecurityException
  127. *@throwsNoSuchMethodException
  128. *@throwsIllegalArgumentException
  129. *@throwsIllegalAccessException
  130. *@throwsInvocationTargetException
  131. */
  132. privateTypeexecute(Typeobj,Typearg,Stringope)
  133. throwsSecurityException,NoSuchMethodException,
  134. IllegalArgumentException,IllegalAccessException,
  135. InvocationTargetException{
  136. Classc=obj.getClass();
  137. Class[]args=newClass[1];
  138. args[0]=arg.getClass();
  139. Methodm=null;
  140. if(ope.equals("+")){
  141. m=c.getMethod("bing",args);
  142. }elseif(ope.equals("*")){
  143. m=c.getMethod("jiao",args);
  144. }elseif(ope.equals("-")){
  145. m=c.getMethod("cha",args);
  146. }else{
  147. System.out.println("NoSuchMethod");
  148. returnnull;
  149. }
  150. return(Type)m.invoke(obj,newObject[]{arg});
  151. }
  152. /**
  153. *读入用户输入的匹配规则如:((C+B)*A)-B
  154. *
  155. *@return
  156. */
  157. publicstaticStringreadInput(){
  158. Stringret=null;
  159. BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
  160. try{
  161. ret=br.readLine();
  162. }catch(IOExceptione){
  163. e.printStackTrace();
  164. returnnull;
  165. }
  166. returnret;
  167. }
  168. /**
  169. *构造工厂
  170. *
  171. *@paramtype
  172. *@return
  173. */
  174. privateTypetypeFactory(Stringtype){
  175. if(type.equals("A")){
  176. returnnewType(a.getArray());
  177. }elseif(type.equals("B")){
  178. returnnewType(b.getArray());
  179. }elseif(type.equals("C")){
  180. returnnewType(c.getArray());
  181. }elseif(type.equals("T")){
  182. returnnewType(t.getArray());
  183. }else{
  184. returnnull;
  185. }
  186. }
  187. /**
  188. *把如{13,2,1,20,30,50}的集合抽象成一个类,提供并、交、差操作
  189. *
  190. *@authorbzwm
  191. *
  192. */
  193. classType{
  194. privateListarray=newArrayList();
  195. publicType(Stringsrt){
  196. this.array=createList(srt);
  197. }
  198. publicType(Listlist){
  199. this.array.addAll(list);
  200. }
  201. publicListgetArray(){
  202. returnthis.array;
  203. }
  204. /**
  205. *并操作
  206. *
  207. *@paramarg
  208. *@return
  209. */
  210. publicTypebing(Typearg){
  211. //是否加入到集合中的标志
  212. booleanadd=true;
  213. //取出传入的Type对象的List
  214. Listlist=arg.getArray();
  215. //遍历传入的Type对象的List
  216. for(inti=0;i<list.size();i++){
  217. add=true;
  218. //与array里的值一一进行比较,如果全都不等,则加入到原array中,否则不加入
  219. for(intj=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. returnnewType(array);
  231. }
  232. /**
  233. *交操作
  234. *
  235. *@paramarg
  236. *@return
  237. */
  238. publicTypejiao(Typearg){
  239. //是否加入到集合中的标志
  240. booleanadd=false;
  241. //存放交集数据的List
  242. Listret=newArrayList();
  243. //取出传入的Type对象的List
  244. Listlist=arg.getArray();
  245. //遍历传入的Type对象的List
  246. for(inti=0;i<list.size();i++){
  247. add=false;
  248. //与array里的值一一进行比较,如果有相等的,则加入到ret中,否则不加入
  249. for(intj=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. returnnewType(ret);
  261. }
  262. /**
  263. *差操作
  264. *
  265. *@paramarg
  266. *@return
  267. */
  268. publicTypecha(Typearg){
  269. //是否加入到集合中的标志
  270. booleanadd=true;
  271. //存放交集数据的List
  272. Listlist=arg.getArray();
  273. //遍历传入的Type对象的List
  274. for(inti=0;i<list.size();i++){
  275. add=true;
  276. //与array里的值一一进行比较,如果有相等的,则从原array中将其删除,如果全都不等,则加入到原array中
  277. for(intj=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. returnnewType(array);
  291. }
  292. /**
  293. *解析字符串,将数字加入到List中
  294. *
  295. *@paramstr
  296. *@return
  297. */
  298. privateListcreateList(Stringstr){
  299. //将字符串解析成字符串数组A{13,2,1,20,30,50}-->newString[]{13,2,1,20,30,50}
  300. Strings[]=str.replaceAll(str.substring(0,1),"").replace("{",
  301. "").replace("}","").split(",");
  302. Listlist=newArrayList();
  303. for(inti=0;i<s.length;i++){
  304. list.add(newInteger(s[i]));
  305. }
  306. returnlist;
  307. }
  308. }
  309. /**
  310. *测试程序
  311. *@paramargs
  312. */
  313. publicstaticvoidmain(Stringargs[]){
  314. EditorStringes=newEditorString();
  315. es.readFile("input.txt");
  316. es.displayResult(readInput());//((C+B)*A)-B
  317. }
  318. }

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

有问题了再说啊!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics