和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

现实中军队树状结构的实现

抽象单位类,Soldier和TroopUnit的基类:
package com.sitinspring;

/**
 * 抽象单位类,Soldier和TroopUnit的基类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 * @date 2007-12-4
 
*/

public abstract class Unit {
    
// 单位名
    protected String name;

    
// 所在单位
    protected TroopUnit currTroopUnit;

    
protected static final String TAB = "    ";

    
public Unit(String name) {
        
this.name = name;
    }


    
// 打印信息,强制子类实现
    public abstract void printInfo(String tabs);

    
// 取得单位的绝对路径
    public String getPath() {
        StringBuffer sb 
= new StringBuffer();

        TroopUnit troopUnitointer 
= currTroopUnit;

        
if (troopUnitointer == null{
            
return "顶级";
        }

        
while (troopUnitointer != null{
            
// 取得的单位名放置在前方
            sb.insert(0, troopUnitointer.name + "/");

            
// 继续向上回溯
            troopUnitointer = troopUnitointer.currTroopUnit;
        }


        
return sb.toString();
    }


    
public void setCurrTroopUnit(TroopUnit currTroopUnit) {
        
this.currTroopUnit = currTroopUnit;
    }


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


    
public TroopUnit getCurrTroopUnit() {
        
return currTroopUnit;
    }


    
public String getName() {
        
return name;
    }

}

Soldier类:
package com.sitinspring;

/**
 * Soldier类,继承自Unit
 * 
@author sitinspring(junglesong@gmail.com)
 *
 * @date 2007-12-4
 
*/

public class Soldier extends Unit{
    
public Soldier(String name){
        
super(name);
    }

    
    
/**
     * 打印士兵的信息
     
*/

    
public void printInfo(String tabs){
        System.out.println(tabs
+" 士兵名="+name+" path="+getPath());
    }

}


军事建制单位类:
package com.sitinspring;

import java.util.ArrayList;
import java.util.List;

/**
 * 军事建制单位类,继承自Unit
 * 
@author sitinspring(junglesong@gmail.com)
 *
 * @date 2007-12-4
 
*/

public class TroopUnit extends Unit{
    
// 属下的单位集合,包括士兵及建制单位
    private List<Unit> units;
    
    
public TroopUnit(String name) {
        
super(name);
    }

    
// 删除一个单位
    public void remove(Unit unit) {
        units.remove(unit);
    }

    
    
// 添加一个单位
    public void add(Unit unit) {
        
if (units == null{
            units 
= new ArrayList<Unit>();
        }


        units.add(unit);

        
// 设置添加单位的所在单位为自身
        unit.setCurrTroopUnit(this);
    }

    
    
/**
     * 按名字查找
     * 
@param name
     * 
@param foundUnits
     
*/

    
public void findbyName(String name,List<Unit> foundUnits) {
        
// 对空目录进行检查,以防空指针异常发生
        if (units == null{
            
return;
        }


        
// 遍历查找
        for (Unit unit : units) {
            
if (unit instanceof TroopUnit) {
                
// 找到目录
                TroopUnit troopUnit = (TroopUnit) unit;

                
if (troopUnit.units == null
                        
|| troopUnit.units.size() == 0{
                    
continue ;
                }
 else {
                    
// 有子单位则继续向下递归遍历
                    troopUnit.findbyName(name,foundUnits);
                }


            }
 else {
                Soldier soldier 
= (Soldier) unit;

                
if (soldier.getName().contains(name)) {
                    foundUnits.add(soldier);
                }

            }

        }

    }

    

    
/**
     * 打印单位信息,包括其下包括的单位
     
*/

    
public void printInfo(String tabs) {
        
// 输出本身的信息
        System.out.println(tabs + " 单位名=" + name + " path=" + getPath());

        
// 对属下的单位集合进行检查,以防空指针异常发生
        if (units == null{
            
return;
        }


        
// 将属下的单位集合中的文件目录信息也打印出来
        for (Unit unit : units) {
            
// tabs + TAB是让下到一层目录就缩进一次
            unit.printInfo(tabs + TAB);
        }

    }

}


调用:
package com.sitinspring;

import java.util.ArrayList;
import java.util.List;

/**
 * 程序入口
 * 
@author sitinspring(junglesong@gmail.com)
 *
 * @date 2007-12-4
 
*/

public class Main{
    
public static void main(String[] args){
        
// 一级一级的建立体系结构
        Soldier xsd=new Soldier("许三多");
        TroopUnit sanban
=new TroopUnit("三班");
        sanban.add(xsd);
        
        Soldier xsd1
=new Soldier("许二多");
        TroopUnit wuban
=new TroopUnit("五班");
        wuban.add(xsd1);
        
        TroopUnit yipai
=new TroopUnit("一排");
        yipai.add(sanban);
        yipai.add(wuban);
        
        TroopUnit qilian
=new TroopUnit("七连");
        qilian.add(yipai);
        
        Soldier wuliuyi
=new Soldier("伍六一");
        TroopUnit yiban
=new TroopUnit("一班");
        yiban.add(wuliuyi);
        
        TroopUnit yipai1
=new TroopUnit("一排");
        yipai1.add(yiban);
        
        TroopUnit yilian
=new TroopUnit("一连");
        yilian.add(yipai1);        
        
        TroopUnit yiying
=new TroopUnit("一营");
        yiying.add(qilian);
        yiying.add(yilian);
        
        TroopUnit zhuangjiatuan
=new TroopUnit("装甲团");
        zhuangjiatuan.add(yiying);
        
        TroopUnit zhuangjiashi
=new TroopUnit("装甲师");
        zhuangjiashi.add(zhuangjiatuan);
        
        TroopUnit sanshibajun
=new TroopUnit("甲种军");
        sanshibajun.add(zhuangjiashi);
        
        
// 打印整体结构
        sanshibajun.printInfo("");
        
        
// 找出名字中包含"许"的士兵
        List<Unit> foundUnits=new ArrayList<Unit>();
        sanshibajun.findbyName(
"", foundUnits);
        
        
// 打印找出的单位
        for(Unit unit:foundUnits){
            unit.printInfo(
"");
        }

    }

    
}

执行结果:
 单位名=甲种军 path=顶级
     单位名
=装甲师 path=甲种军/
         单位名
=装甲团 path=甲种军/装甲师/
             单位名
=一营 path=甲种军/装甲师/装甲团/
                 单位名
=七连 path=甲种军/装甲师/装甲团/一营/
                     单位名
=一排 path=甲种军/装甲师/装甲团/一营/七连/
                         单位名
=三班 path=甲种军/装甲师/装甲团/一营/七连/一排/
                             士兵名
=许三多 path=甲种军/装甲师/装甲团/一营/七连/一排/三班/
                         单位名
=五班 path=甲种军/装甲师/装甲团/一营/七连/一排/
                             士兵名
=许二多 path=甲种军/装甲师/装甲团/一营/七连/一排/五班/
                 单位名
=一连 path=甲种军/装甲师/装甲团/一营/
                     单位名
=一排 path=甲种军/装甲师/装甲团/一营/一连/
                         单位名
=一班 path=甲种军/装甲师/装甲团/一营/一连/一排/
                             士兵名
=伍六一 path=甲种军/装甲师/装甲团/一营/一连/一排/一班/
 士兵名
=许三多 path=甲种军/装甲师/装甲团/一营/七连/一排/三班/
 士兵名
=许二多 path=甲种军/装甲师/装甲团/一营/七连/一排/五班/


代码下载:
http://www.blogjava.net/Files/sitinspring/TroopTree20071204123647.rar

posted on 2008-02-22 10:31 和风细雨 阅读(307) 评论(0)  编辑  收藏


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


网站导航: