春天里,百花香...
			
			
				
					
			  
	#
	
		
			
			
			在面向对象编程中,我们一般采用从顶向下的编程方式,即先设计类的层次,如View,Controller,Service,Dao,Domain,Util等,再完善各层中的类。在这个过程中,我发现按功能和形态来分,系统中类可分为以下几个类别:  
1.实体类(Entity Classes):这种类一般是现实世界事物在代码世界中的抽象表示,和现实事物有着一一对应关系.存储到持久介质中时一般对应着一条记录.如MIS系统中常见的雇员类Employee,论坛系统中常见的Topic等.由于这些类可以直接从现实事物中归纳抽象得来,写出它们的框架代码一般相对方便容易,但要真正理顺实体类之间的关系需要投入不少精力,这些类一般处于Domain层中. 
2.通道类(Plumbing Classes):这种类一般用于充当传输实体类的通道,在编程中,经常需要从持久层取出一个或多个实体类的对象或是将实体类的对象存储到持久层中,这种任务一般由通道类来完成.它们一般由Service或是Dao层中的类来承担.这些类一般不保存状态,对外界来说,它们的对外接口(Public Interface)一般比具体的实现重要,在数量较多时,也经常抽象出一些上层的抽象类或是接口出来以方便调用. 
3.辅助类(Assistant Classes):这些类一般起辅助任务,一般可以把共通的处理和变量放在其中供其他层次类调用,这样做一能避免散弹式修改,二能减少重复代码,三能提高代码复用度.辅助类一般放在Util包中. 
4.框架类(Framework Classes):这些类一般由固定的框架提供,程序员不能改变.在类的层次上它一般处于界面和业务层之间,即控制层的位置,jsp/servlet中的Servlet,Struts1,2中的Action都是这样的类,它承担了接受用户输入,并展示业务处理的结果的任务.
			
			
		 
	
		
			
			
			一个技术人员要生存,要发展,要成一番事业,必须遵循一定固定的法则,若逆天而行而不自觉,轻则徒劳无功,白费精力;重则无法立足,庸碌一生。因此把握住自己的发展之道是技术人首要的大事,只有走在正确的道路上,前进才有意义。 
一个技术人员,首先要固本培元,什么是技术人的根本呢?无论语言,框架和技术如何发展,数据结构和算法都是其核心内容,所谓万变不离其宗,有了良好的数据结构和算法的根基,接受并掌握一个新兴事物不过旬月时间,若没有而盲目跟随,事倍而功半矣。另外面向对象的精髓也要把握,从根本上来讲,任何现代框架其核心思想还是没有超越面向对象的范畴,都是面向对象的继承和发展,理解掌握了面向对象的思想,就把握住了框架根本性的东西,学习掌握起来就更容易把握其本质. 
其次,技术人员必须把握主流技术方向才不至于迷失自己。若在支流中迷失自己恐有空执屠龙之技无用武之地之忧,古代也许还能自娱自乐,现代社会这样做温饱都无法解决,房子,车子,孩子更是白扯;只有置身主流,才能继续奋斗下去。当前的主流技术方向,无非SSH(Struts1/2,Spring,Hibernate)而已,彻底弄清楚它们,才有安身立命之本.君不见诸多招聘广告,均写SSH乎.这三项其实也不好掌握,尤其Hibernate,掌握不精深也不行,有些大侠也曾阴沟里翻过船。 
其三,技术人员要乐于善于总结提高,对于已经掌握的内容,要及时归纳总结到纸面上,这样做一能梳理脉络,让自己掌握得更全面细致;二能查漏补缺,发现以前忽视或是未接触过的领域;三能求其友声,放在博客上供大家分析阅读讨论,弥补自己的不足.有此三益,于己于人都是一件大好事,何乐而不为呢? 
其四,技术人员要展示自己的能力和价值,应该具备自己的产品,它可以用来巩固和展现自己的实力,在产品的研发过程中,技术人员能把自己的知识智慧实用化,可避免走入象牙塔之患;外界也能通过产品来了解发掘自己.这也是一件于己于人都有利的事情. 
其五,技术人员应该具备完整的思想体系,有自己独到的见解并能有所突破创新. 人云亦云无异于鹦鹉学舌,有何能哉? 要想上一个层次,必须鲤鱼跃龙门. Gosing和Kaven两人可作为最好的榜样。 
最后,广博的知识不可少.拘泥于一处难免死钻牛角尖,很多情况下换一种思维顿时有拨云见日之感,如有闲暇,技术人员应该跳出圈子,广采能用之材为我所用.
			
			
		 
	
		
			
			
			     摘要: 称球问题经常是面试中的常客,这里我用做了一个称球的程序,主要的方法就是递归和扫描,贴出来请大家指正。  
阅读全文
			
			
		 
	
		
			
			
			     摘要: /** *//**
 * 二叉树节点类
 * @author HEYANG
 * @since 2008-7-26 下午02:59:06
 */
class Node<T extends Comparable> {
 ...  
阅读全文
			
			
		 
	
		
			
			
			     摘要: 这是一个美国IT企业的面试题,原题大意是从一个文件中读取出可连通的城市对,给出两个城市,判断是否可连通,如果可连通就输出yes,不可连通就输出no,否则给出命令行帮助。
其实判断连接状态不用遍历图,用蔓延法即可,具体做法就是从起始城市开始,依次改变其周边连通城市的连通状态,再从周边开始向周边连通城市蔓延,如果能蔓延到结束城市的周边可连通城市,则说明两个城市是完全可连通的。这种做法和多米诺骨牌效应很像。我姑且称之为蔓延法。
  
阅读全文
			
			
		 
	
		
			
			
			 找出以下字符串=符号后面对应的属性值
找出以下字符串=符号后面对应的属性值

 "职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男  年龄=45 ";
"职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男  年龄=45 ";

 import java.util.regex.Matcher;
import java.util.regex.Matcher;
 import java.util.regex.Pattern;
import java.util.regex.Pattern;


 /** *//**
/** *//**
 * 用正则表达式找出每个属性对应的值
 * 用正则表达式找出每个属性对应的值
 * @author HEYANG
 * @author HEYANG
 * @since 2008-7-23 下午08:12:45
 * @since 2008-7-23 下午08:12:45
 */
 */

 public class RegexFindProperty
public class RegexFindProperty  {
{


 public static void main(String[] args)
  public static void main(String[] args)  {
{
 String input = "职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男  年龄=45 ";
    String input = "职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男  年龄=45 ";
 
    
 // =号和空白符之间是非空格字符,这种写法比去分开组合字母,数字和汉字的方式要快捷
    // =号和空白符之间是非空格字符,这种写法比去分开组合字母,数字和汉字的方式要快捷
 Pattern pattern = Pattern.compile("=(\\S+)\\s*");
    Pattern pattern = Pattern.compile("=(\\S+)\\s*");

 // 用Pattern类的matcher()方法生成一个Matcher对象
    // 用Pattern类的matcher()方法生成一个Matcher对象
 Matcher m = pattern.matcher(input);
    Matcher m = pattern.matcher(input);

 // 使用find()方法查找第一个匹配的对象
    // 使用find()方法查找第一个匹配的对象
 boolean result = m.find();
    boolean result = m.find();

 // 使用循环找出模式匹配的内容打印
    // 使用循环找出模式匹配的内容打印

 while (result)
    while (result)  {
{
 // 取得匹配的结果
      // 取得匹配的结果
 String replaceStr = m.group(1);
          String replaceStr = m.group(1);
 System.out.println("匹配的属性等于=" + replaceStr);
          System.out.println("匹配的属性等于=" + replaceStr);
 
          
 result = m.find();
      result = m.find();
 }
    }
 }
  }
 }
} 
	
		
			
			
			     摘要: package com.sitinspring.datetime;
import java.util.ArrayList;
import java.util.List;
public class MonthlyCalendar{
    private static f...  
阅读全文
			
			
		 
	
		
			
			
			     摘要: 输出示例:
当前日期时间为:2008.07.18 10:48:57
当前日期为:2008.07.18
当前日期为:2008.7.18
当前时间为:10:48:57
2008.07.05与2008.07.18之间相隔:13天
当前年月为:2008.07
本月第一天为周2
本月有31天
  
阅读全文
			
			
		 
	
		
			
			
			Comparator的具体实现类

 public class AgeComparator implements Comparator
public class AgeComparator implements Comparator  {
{

 public int compare(Object op1, Object op2)
  public int compare(Object op1, Object op2)  {
{
 Employee eOp1 = (Employee) op1;
    Employee eOp1 = (Employee) op1;
 Employee eOp2 = (Employee) op2;
    Employee eOp2 = (Employee) op2;

 // 按年龄排序
    // 按年龄排序
 return eOp1.getAge()-(eOp2.getAge());
    return eOp1.getAge()-(eOp2.getAge());
 }
  }
 }
}


 public class NameComparator implements Comparator
public class NameComparator implements Comparator  {
{

 public int compare(Object op1, Object op2)
  public int compare(Object op1, Object op2)  {
{
 Employee eOp1 = (Employee) op1;
    Employee eOp1 = (Employee) op1;
 Employee eOp2 = (Employee) op2;
    Employee eOp2 = (Employee) op2;

 // 按姓名排序
    // 按姓名排序
 return eOp1.getName().compareTo(eOp2.getName());
    return eOp1.getName().compareTo(eOp2.getName());
 }
  }
 }
}


 public class SalaryComparator implements Comparator
public class SalaryComparator implements Comparator  {
{

 public int compare(Object op1, Object op2)
  public int compare(Object op1, Object op2)  {
{
 Employee eOp1 = (Employee) op1;
    Employee eOp1 = (Employee) op1;
 Employee eOp2 = (Employee) op2;
    Employee eOp2 = (Employee) op2;

 // 按薪水排序
    // 按薪水排序
 return eOp1.getSalary()-(eOp2.getSalary());
    return eOp1.getSalary()-(eOp2.getSalary());
 }
  }
 }
}

Employee类:

 public class Employee
public class Employee {
{
 protected String name;
  protected String name;
 protected int age;
  protected int age;
 protected int salary;
  protected int salary;
 
  

 public Employee(String name,int age,int salary)
  public Employee(String name,int age,int salary) {
{
 this.name=name;
    this.name=name;
 this.age=age;
    this.age=age;
 this.salary=salary;
    this.salary=salary;
 }
  }
 
  

 public int getAge()
  public int getAge()  {
{
 return age;
    return age;
 }
  }

 public void setAge(int age)
  public void setAge(int age)  {
{
 this.age = age;
    this.age = age;
 }
  }

 public String getName()
  public String getName()  {
{
 return name;
    return name;
 }
  }

 public void setName(String name)
  public void setName(String name)  {
{
 this.name = name;
    this.name = name;
 }
  }

 public int getSalary()
  public int getSalary()  {
{
 return salary;
    return salary;
 }
  }

 public void setSalary(int salary)
  public void setSalary(int salary)  {
{
 this.salary = salary;
    this.salary = salary;
 }
  } 
 }
}

测试:

 public class Main
public class Main {
{

 public static void main(String[] args)
  public static void main(String[] args) {
{
 List<Employee> employees=new ArrayList<Employee>();
    List<Employee> employees=new ArrayList<Employee>();
 
    
 employees.add(new Employee("Andy",21,2000));
    employees.add(new Employee("Andy",21,2000));
 employees.add(new Employee("Felix",21,3000));
    employees.add(new Employee("Felix",21,3000));
 employees.add(new Employee("Bill",35,20000));
    employees.add(new Employee("Bill",35,20000));
 employees.add(new Employee("Helen",21,10000));
    employees.add(new Employee("Helen",21,10000));
 employees.add(new Employee("Cindy",28,8000));
    employees.add(new Employee("Cindy",28,8000));
 employees.add(new Employee("Douglas",25,5000));
    employees.add(new Employee("Douglas",25,5000));
 
        
 // 按名称排序
    // 按名称排序
 Collections.sort(employees,new NameComparator());
      Collections.sort(employees,new NameComparator());
 display(employees);
      display(employees);

 // 按年龄排序
      // 按年龄排序
 Collections.sort(employees,new AgeComparator());
      Collections.sort(employees,new AgeComparator());
 display(employees);
      display(employees);
 
      
 // 按薪水排序
      // 按薪水排序
 Collections.sort(employees,new SalaryComparator());
      Collections.sort(employees,new SalaryComparator());
 display(employees);
      display(employees);
 }
  }
 
  

 public static void display(List<Employee> employees)
  public static void display(List<Employee> employees) {
{

 for(Employee e:employees)
    for(Employee e:employees) {
{
 System.out.println("雇员名="+e.getName()+" 年龄="+e.age+" 薪水="+e.getSalary());
      System.out.println("雇员名="+e.getName()+" 年龄="+e.age+" 薪水="+e.getSalary());
 }
    }
 
    
 System.out.println();
    System.out.println();
 }
  }
 }
}

输出:
 雇员名=Andy 年龄=21 薪水=2000
雇员名=Andy 年龄=21 薪水=2000
 雇员名=Bill 年龄=35 薪水=20000
雇员名=Bill 年龄=35 薪水=20000
 雇员名=Cindy 年龄=28 薪水=8000
雇员名=Cindy 年龄=28 薪水=8000
 雇员名=Douglas 年龄=25 薪水=5000
雇员名=Douglas 年龄=25 薪水=5000
 雇员名=Felix 年龄=21 薪水=3000
雇员名=Felix 年龄=21 薪水=3000
 雇员名=Helen 年龄=21 薪水=10000
雇员名=Helen 年龄=21 薪水=10000

 雇员名=Andy 年龄=21 薪水=2000
雇员名=Andy 年龄=21 薪水=2000
 雇员名=Felix 年龄=21 薪水=3000
雇员名=Felix 年龄=21 薪水=3000
 雇员名=Helen 年龄=21 薪水=10000
雇员名=Helen 年龄=21 薪水=10000
 雇员名=Douglas 年龄=25 薪水=5000
雇员名=Douglas 年龄=25 薪水=5000
 雇员名=Cindy 年龄=28 薪水=8000
雇员名=Cindy 年龄=28 薪水=8000
 雇员名=Bill 年龄=35 薪水=20000
雇员名=Bill 年龄=35 薪水=20000

 雇员名=Andy 年龄=21 薪水=2000
雇员名=Andy 年龄=21 薪水=2000
 雇员名=Felix 年龄=21 薪水=3000
雇员名=Felix 年龄=21 薪水=3000
 雇员名=Douglas 年龄=25 薪水=5000
雇员名=Douglas 年龄=25 薪水=5000
 雇员名=Cindy 年龄=28 薪水=8000
雇员名=Cindy 年龄=28 薪水=8000
 雇员名=Helen 年龄=21 薪水=10000
雇员名=Helen 年龄=21 薪水=10000
 雇员名=Bill 年龄=35 薪水=20000
雇员名=Bill 年龄=35 薪水=20000



 
	
		
			
			
			     摘要: 回溯法有“通用的解题法“之称。用它可以系统的搜索一个问题的所有解或任一解。会所法是一个既带有系统性又带有跳跃性的搜索算法,他在包含问题的所有解的解空间树中,按照深度有限的策略,从根节点出发搜索解空间树,算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解。如果肯定不包含,则跳过对该节点为根的子树的系统搜索,逐层向其祖先节点回溯,否则进入该子树,继续按照深度优先的策略进行搜索。回溯法在用来求问题的任一接时,只要搜索到问题的一个解就可以结束。
这种深度优先的解的算法称为回溯法,它适合于解一些组合数较大的问题。
用回溯法解n皇后问题时,可以用一棵完全n叉树来表示其解空间。剪去不满足行列和斜线攻击的子树后,剩下的就是问题的解答。
  
阅读全文
			
			
		 
	
				
			 
			
sitinspring(http://www.blogjava.net)原创,转载请注明出处.