(每日一转)黑马程序员--- 最近逛黑马论坛写的一些代码


一、黑马2013年java学科开班查询工具(论坛上得技术分的题目)

1.要求:

实现代码如下:

  1. import java.awt.Button;  
  2. import java.awt.Color;  
  3. import java.awt.FlowLayout;  
  4. import java.awt.Frame;  
  5. import java.awt.TextArea;  
  6. import java.awt.TextField;  
  7. import java.awt.event.ActionEvent;  
  8. import java.awt.event.ActionListener;  
  9. import java.awt.event.MouseAdapter;  
  10. import java.awt.event.MouseEvent;  
  11. import java.awt.event.WindowAdapter;  
  12. import java.awt.event.WindowEvent;  
  13. import java.io.BufferedReader;  
  14. import java.io.IOException;  
  15. import java.io.InputStream;  
  16. import java.io.InputStreamReader;  
  17. import javax.swing.ButtonGroup;  
  18. import javax.swing.JRadioButton;  
  19. import com.itheima.bbs.querytime.ClassStartingTimeQuery;  
  20.   
  21. public class ClassStartingDateQuery {  
  22.     private Frame frame;  
  23.     private Button button;  
  24.     private TextField textField;  
  25.     private TextArea textArea;  
  26.     private JRadioButton cloudRadButton;  
  27.     private JRadioButton androidRadioButton;  
  28.   
  29.       
  30.     public ClassStartingDateQuery(){  
  31.         init();  
  32.     }     
  33.     private void init() {  
  34.         //初始化窗口  
  35.         frame = new Frame("2013年黑马Java学科开班日期查询");  
  36.         frame.setBounds(300300400280);//设置窗口大小  
  37.         frame.setLayout(new FlowLayout());  
  38.         frame.setResizable(false);//窗口大小固定  
  39.           
  40.         //初始化输入区和显示区  
  41.         textField=new TextField(30);  
  42.         textField.setText("请安“第xx期”格式输入");        
  43.         textArea = new TextArea("",1050,TextArea.SCROLLBARS_VERTICAL_ONLY);         
  44.         textArea.setEditable(false);//显示区设为不可编辑  
  45.         textArea.setBackground(Color.WHITE);//显示区背景色改为白色。  
  46.           
  47.         //初始化查询按钮  
  48.         button=new Button("查询");  
  49.           
  50.         //定义单选按钮,并将安卓课程定义为默认选项  
  51.         cloudRadButton=new JRadioButton("JavaEE+物联云计算课程");  
  52.         androidRadioButton = new JRadioButton("JavaEE+Android课程");  
  53.         androidRadioButton.setSelected(true);  
  54.         //定义单选按钮互斥区  
  55.         ButtonGroup buttonGroup = new ButtonGroup();  
  56.         buttonGroup.add(cloudRadButton);  
  57.         buttonGroup.add(androidRadioButton);          
  58.           
  59.         //将以上组件添加到窗口上。  
  60.         frame.add(androidRadioButton);  
  61.         frame.add(cloudRadButton);        
  62.         frame.add(textField);  
  63.         frame.add(button);  
  64.         frame.add(textArea);  
  65.           
  66.         myEvent();  
  67.         frame.setVisible(true);  
  68.           
  69.           
  70.     }  
  71.     private void myEvent() {  
  72.         frame.addWindowListener(new WindowAdapter() {  
  73.              public void windowClosing(WindowEvent e) {  
  74.                  //关闭窗口  
  75.                  System.exit(0);  
  76.              }  
  77.         });  
  78.           
  79.         textField.addMouseListener(new MouseAdapter() {  
  80.             public void mousePressed(MouseEvent e){  
  81.                 //鼠标进入输入区时,输入区内容清空,并在显示区提示要查询的期数限制  
  82.                 textField.setText("");  
  83.                 textArea.setText("2013年黑马训练营有:\n" +  
  84.                         "JavaEE+物联云计算课程\t第02期~第10期\n" +  
  85.                         "JavaEE+Android课程 \t第17期~第24期\n");  
  86.             }  
  87.         });  
  88.           
  89.         button.addActionListener(new ActionListener() {           
  90.             @Override  
  91.             public void actionPerformed(ActionEvent e){                   
  92.                 //判读field输入的询格式是否正确  
  93.                 String editionName = null;                
  94.                 if(textField.getText().matches("第\\d{2,}期")){//判断输入格式是正确  
  95.                     editionName = textField.getText();                    
  96.                 }else{  
  97.                     textArea.setText("查询格式错误!请按“第**期”输入,如“第04期”");  
  98.                     return;//格式不正确就直接返回。  
  99.                 }  
  100.                   
  101.                 //获取选定的是哪个个课程  
  102.                 String courseName =null;  
  103.                 if(cloudRadButton.isSelected()){  
  104.                     courseName=cloudRadButton.getText();  
  105.                 }else{  
  106.                     courseName=androidRadioButton.getText();  
  107.                 }  
  108.                 //根据上边的两个条件查询日期,并显示在显示区  
  109.                 String classStartingTime = queryTime(editionName,courseName);     
  110.                 textArea.setText(classStartingTime);  
  111.                                   
  112.             }  
  113.         });  
  114.           
  115.     }     
  116.   
  117.     private String queryTime(String editionName,String courseName) {  
  118.         BufferedReader bufr=null;     
  119.         try {  
  120.             //通过该类的类加载器加载资源文件。  
  121.             InputStream is=ClassStartingTimeQuery.class.getResourceAsStream("data.txt");  
  122.             //定义缓冲区  
  123.             bufr=new BufferedReader(new InputStreamReader(is));  
  124.             String buf =null;             
  125.             while((buf=bufr.readLine())!=null){  
  126.                 //判断改行有没有要查询的两个条件,有则返回该行包含的日期  
  127.                 if(buf.contains(editionName)&&buf.contains(courseName)){  
  128.                     //得到该行包含的日期                   
  129.                     String [] strs = buf.split(" ");                      
  130.                     return strs[0]; //其实return buf,也可以,但既然前边都判断过了,这里还是处理下。                    
  131.                 }                                     
  132.             }  
  133.         } catch (Exception e) {           
  134.             e.printStackTrace();  
  135.         }finally{  
  136.             try {  
  137.                 //关闭资源  
  138.                 if(bufr!=null)  
  139.                     bufr.close();  
  140.             } catch (IOException e) {                 
  141.                 e.printStackTrace();  
  142.             }  
  143.         }     
  144.         //如果没有查询到,则提示没有该期的课程  
  145.         return courseName+"2013年没有该期("+editionName+")的黑马培训班";         
  146.     }  
  147.       
  148.     public static void main(String[] args) {          
  149.         new ClassStartingDateQuery();  
  150.     }  
  151. }  


3、运行结果:

二、

1.题    目:给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合, 例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1], 这样输出就有4个不同的组合,它们的相加之和为 4:4, 3+1, 2+2, and 2+1+1。 请设计一个高效算法实现这个需求。

2.解题思路
  1.判断这n个数之和是否为t,是在将其打印
  2.从n个数中取出一个数,判断剩余数之和是否为t,循环n次;
  3.每个循环内部又转到1,当求和元素只有两个时退出(求和最少得有2个元素)。
  进一步分析:
  从上边得到打印出的结果,会出现重复,所以,将每次筛选出的组合存入TreeSet中,最后再打印TreeSet集合。

 3.代码实现

  1. import java.util.ArrayList;  
  2. import java.util.Arrays;  
  3. import java.util.List;  
  4. import java.util.TreeSet;  
  5.   
  6. public class NumberGroup {  
  7.   
  8.     private static TreeSet<String> ts = new TreeSet<String>();  
  9.     public static void main(String[] args) {  
  10.           
  11.               Integer [] arr = {15,16,17,18,-1,-2,-3,0};                
  12.               int key = 15;  
  13.               //先对数组排序,以使其打印结果有序。  
  14.               Arrays.sort(arr);  
  15.               //一开始用List的时候,filterNumGroup会报错,故转成ArrayList  
  16.               List<Integer> list=Arrays.asList(arr);  
  17.               ArrayList<Integer> nums=new ArrayList<Integer>(list);  
  18.               //筛选组合  
  19.               filterNumGroup(nums, key);                
  20.                 
  21.               //打印结果  
  22.               for(String str:ts){  
  23.                   System.out.println(str);  
  24.               }             
  25.             }   
  26.               
  27.             public static void filterNumGroup(ArrayList<Integer> nums,int key){             
  28.                 if(key==getSum(nums)){    
  29.                     ts.add(getNumbers(nums));                                 
  30.                 }else{  
  31.                     if(nums.size()>2){//此处如果2改为1,则会筛选出跟key(即t)相等的元素。  
  32.                         //思路中的第2步。  
  33.                         for(int index=0;index<nums.size();index++){  
  34.                             //此处,不能写成numsClone=nums,因为这样做它们指向的是同一个元素。  
  35.                             ArrayList<Integer> numsClone=new ArrayList<Integer>(nums);                            
  36.                             numsClone.remove(index);  
  37.                             filterNumGroup(numsClone,key);//递归调用  
  38.                         }  
  39.                     }  
  40.                 }  
  41.             }  
  42.             //求和  
  43.             public static int getSum(List<Integer> nums){  
  44.                 int sum=0;    
  45.                 for(Integer num:nums ){  
  46.                     sum+=num;  
  47.                 }  
  48.                 return sum;  
  49.             }  
  50.             //将每一个组合转成String  
  51.             public static String getNumbers(List<Integer> nums) {           
  52.                 StringBuilder sb = new StringBuilder();  
  53.                 for(Integer num:nums){  
  54.                     sb.append(num+" ");  
  55.                 }                 
  56.                 return sb.toString();             
  57.                   
  58.             }  
  59. }  

小 结:上面的代码只是实现了功能,算不上高效。其实上边的题目和求多元方程(某一范围内)解的题目,都可以归为从M个数中取出N个数并进行排列组合的问题,利用穷举法举出所有的组合,然后让计算机根据判断条件(方程式)进行筛选。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值