<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title><![CDATA[Welcome to JTL's Blog]]></title>
    <link><![CDATA[http://www.hartech.cn/blog/]]></link>
    <description><![CDATA[The world always makes way for the dreamer.]]></description>
    <dc:language>zh-cn</dc:language>
    <dc:creator><![CDATA[jtl.zheng@gmail.com]]></dc:creator>
    <dc:rights><![CDATA[Copyright 2012JTL. All rights reserved.]]></dc:rights>
    <dc:date>2012-02-08T22:30:06Z</dc:date>
    <admin:generatorAgent rdf:resource="http://www.hartech.cn/blog/" />
    <admin:errorReportsTo rdf:resource="http://www.hartech.cn/blog/"/>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>

	<image>
    <title><![CDATA[Welcome to JTL's Blog]]></title>
    <link><![CDATA[http://www.hartech.cn/blog/]]></link>
	<url><![CDATA[http://www.hartech.cn/blog/images/bloglogo.gif]]></url>
	<width>88</width> 
	<height>31</height> 
	</image>

	<item>
    <title><![CDATA[[Java Ajax] GWT vs. Swing]]></title>
    <description><![CDATA[
这几天学了Google的GWT，即用Java来编写Ajax程序，写了下面这个演示程序。演示了GWT中大部分有用的组件，详细使用方法见源代码内注释。
下面还有一个演示程序是去年学Swing时做的，也是使用了Swing里主要有用的组件，详细说明见源代码内注释。
 
 attachments/gwt/...]]></description>
    <content:encoded><![CDATA[<br />这几天学了Google的GWT，即用Java来编写Ajax程序，写了下面这个演示程序。演示了GWT中大部分有用的组件，详细使用方法见源代码内注释。<br />下面还有一个演示程序是去年学Swing时做的，也是使用了Swing里主要有用的组件，详细说明见源代码内注释。<br />    <br /><div style="text-align:center"><a href="attachments/gwt/gwt4.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/gwt4.gif</a></div><br />    <br /><br />关于Swing的各种布局见：<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=79">http://www.hartech.cn/blog/blogview.asp?logID=79</a><br />关于Swing的各种窗口见：<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=81">http://www.hartech.cn/blog/blogview.asp?logID=81</a><br />    <br />    <br /><font size="5">GWT</font><br />   <br />    <br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与源码:</div>
<div><br /><a target="_blank" href="attachments/gwt/gwt/">进入演示页面</a>   <br /><br /><br />源代码下载（一Eclipse工程）：<br /><a href="attachments/gwt/gwt_src.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>    <br />     <br /><br />上方是事件显示版，用于显示下面各个组件发出的事件类型、发出者和其他信息<br />MenuBar、Button、CheckBox、ToggleBox、RadioButton、PopupPanel、DialogBox<br /><div style="text-align:center"><a href="attachments/gwt/gwt1.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/gwt1.gif</a></div><br /><br />    <br />    <br />     <br />GWT中九种面板的演示，与Swing中一种面板多种布局控制器不同的是，GWT中无布局控制器，每一种面板本身就代表一种布局<br />TabPanel、VerticalPanel、HorizontalSplitPanel、 DockPanel ScrollPanel、 DisclosurePanel、 FlowPanel、 HorizontalPanel、 StackPanel、 Grid <br /><div style="text-align:center"><a href="attachments/gwt/gwt2.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/gwt2.gif</a></div><br /><br />    <br />    <br />     <br /><br />List类演示，这个SuggestBox最有意思<br />SuggestBox、ListBox、Tree<br /><div style="text-align:center"><a href="attachments/gwt/gwt3.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/gwt3.gif</a></div><br /><br /><br />    <br />    <br />     <br />Text类演示，GWT可实时捕捉文本框的各种键盘、鼠标事件（见上方的事件显示板），右边是GWT的富文本RichText编辑框，其下方用于实时显示该RichTextArea的HTML代码。<br />TextBox、PasswordTextBox、TextArea、RichTextArea、RichTextToolbar<br /><div style="text-align:center"><a href="attachments/gwt/gwt4.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/gwt4.gif</a></div><br /><br /><br />    <br /> <br /><font size="5">Swing</font><br />   <br />关于Swing的各种布局见：<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=79">http://www.hartech.cn/blog/blogview.asp?logID=79</a><br />关于Swing的各种窗口见：<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=81">http://www.hartech.cn/blog/blogview.asp?logID=81</a><br />     <br />     <br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与源码:</div>
<div><br /><a target="_blank" href="attachments/gwt/Comp&#111;nentsEX.jar">点击运行该程序(jar)</a>     <br /><br /><a target="_blank" href="http://www.java.com">若不能正常运行请先安装 Java运行环境(JRE)</a> <br /><br /><br />源代码下载：<br /><a href="attachments/gwt/swing_src.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>    <br />    <br />     <br />菜单与Button类演示，与上面GWT类似，上面的DisplayZone也是用于显示各种事件的信息<br />JMenuBar、JMenu、JToolBar、JButton、JPopupMenu、JToggleButton、JCheckBox、JRadioButton、ButtonGroup<br /><div style="text-align:center"><a href="attachments/gwt/swing1.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/swing1.gif</a></div><br />    <br />    <br />    <br />     <br />Bars类演示，图中图片可拖动<br />JProgressBar、JSlider、JSpinner、JTextArea、JScrollPane、ScrollablePicture<br /><div style="text-align:center"><a href="attachments/gwt/swing2.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/swing2.gif</a></div><br />    <br />    <br />    <br />     <br />Texts类演示<br />JLabel、JTextField、JPasswordField<br /><div style="text-align:center"><a href="attachments/gwt/swing3.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/swing3.gif</a></div><br />    <br />    <br />    <br />     <br />Choosers类演示，各种选择组件<br />JComboBox、JList、JFileChooser、JColorChooser<br /><div style="text-align:center"><a href="attachments/gwt/swing4.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/gwt/swing4.gif</a></div><br /><br />
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=98]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=98]]></guid>
    <dc:subject><![CDATA[J2EE]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-11-28T17:27:42Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[感恩]	遇见]]></title>
    <description><![CDATA[						 1，遇见可信任的朋友時 

									要記得好好珍惜他 

									因為在一生中，能遇到这样的朋友并不容易 
 
 
			
 
						 2，遇见人生中的貴人時 
			
									要記得好好感激 

									因為他是你人生的轉折點 
 
			
 
 
						 3，遇...]]></description>
    <content:encoded><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，遇见可信任的朋友時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要記得好好珍惜他   <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為在一生中，能遇到这样的朋友并不容易    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，遇见人生中的貴人時     <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要記得好好感激     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為他是你人生的轉折點     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />         <br />     <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3，遇见你真愛的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要努力爭取和她相伴一生的機會     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為當她離去時，一切都來不及了      <br />    <br />    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4，遇见曾經愛過的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;記得微笑向她感激     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為她是讓你更懂得愛的人     <br />    <br />     <br />    <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5，遇见曾經恨過的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要微笑向她打招呼     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為是她讓你更加堅強     <br />    <br />    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6，遇见曾經背叛你的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要跟他好好聊一聊   <br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為若不是他今天你不會懂得這世界     <br />    <br />    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7，遇见曾經偷偷喜歡的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要记得祝她幸福哦    <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為你喜歡她時，不是希望她幸福快樂嗎？     <br />    <br />    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8，遇见匆匆離開你人生的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要謝謝她走過你的人生    <br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為她是你精采回憶的一部分     <br />    <br />    <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9，遇见曾經和你有誤會的人時     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要趁現在解清誤會     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為你可能只有這一次機會解釋清楚     <br />    <br />        <br />     <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10，遇见相伴一生的人時      <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要心存感激的感謝她愛你     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因為你們現在都得到幸福和真愛<br />    <br /><br />
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=97]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=97]]></guid>
    <dc:subject><![CDATA[感恩]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-07-24T00:12:45Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[Java] JBallField]]></title>
    <description><![CDATA[
按照物理公式计算控制球体的运动与碰撞
可以用来模拟一些物理运动实验

 attachments/jballfield/1.gif 


 
 进入演示页面(applet) 

 点击运行该程序(jar) 

 若不能正常运行请先安装 Java运行环境(JRE) 

 设计文档 

文档、程序、源代码下载：
 C...]]></description>
    <content:encoded><![CDATA[<br />按照物理公式计算控制球体的运动与碰撞<br />可以用来模拟一些物理运动实验<br /><br /><div style="text-align:center"><a href="attachments/jballfield/1.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/1.gif</a></div><br /><br /><br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与下载:</div>
<div><br /><a target="_blank" href="attachments/jballfield/">进入演示页面(&#097;pplet)</a>   <br /><br /><a target="_blank" href="attachments/jballfield/JBallField.jar">点击运行该程序(jar)</a>     <br /><br /><a target="_blank" href="http://www.java.com">若不能正常运行请先安装 Java运行环境(JRE)</a> <br /><br /><a target="_blank" href="attachments/jballfield/JBallField_Specific.doc">设计文档</a><br /><br />文档、程序、源代码下载：<br /><a href="attachments/jballfield/JBallField.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>    <br />    <br />   <br />   <br /><font size="3"><strong>模拟的物理特征：</strong></font><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1，球的属性：质量、直径、受力情况、加速度、速度、平面位置<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2，球的受力：重力、空气阻力、球之间的万有引力、用户控制的力<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3，球碰撞所遵守的公式：能量守恒、动量守恒<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里蓝色的球是用户可以通过键盘 上下左右 键控制的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;采用施力的方式，如按向右5秒，表示给蓝色球施加一个向右100N的力，维持时间为5秒，力度在界面可以调节<br />  <br />   <br />    <br /><strong>一些实验：</strong><br />     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于碰撞采用能量、动量守恒进行计算，可以看到经过一段时间的碰撞后界面下方显示的总能量、X动量、Y动量仍保持不变<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（但这些数字在球数量一多，碰撞一多时还是会有上下轻微波动）<br />     <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开重力效果可以看到不同质量的球从同一高度上做自由落体运动的时间是相同的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而且每次都能反弹到同一个高度<br />  <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开球间万有引力，如果控制得好可以模拟行星绕太阳的向心力运动<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（把关键球质量设为50kg并停住，球数量为2~4，打开空气阻力的话更容易看到效果）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两个同质量的球可以做双子星运动<br />  <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开空气阻力和重力模式，让球从高处落下，可以看到球在向下加速一段时间后停止加速，保持匀速下落<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为空气阻力随速度而成平方比增长，最后抵消了重力<br /><br />    <br />    <br />    <br /><font size="3"><strong>完整的设计说明请下载<a target="_blank" href="attachments/jballfield/JBallField_Specific.doc">设计文档</a>，这里列出一些主要的</strong></font><br />      <br />   <br />   <br />    <br /><strong>关于游戏中各种单位：</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本游戏严格按照物理公式计算结果运行，单位都采用标准单位。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;质量单位为千克kg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;距离单位为米，表现为界面上的十个像素距离<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里场地大小为（70米X 50米），球的直径为2米（像素到米的转换比例由Main.scale_Field_TO_Calculate 控制）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;力单位为牛N<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加速度单位为  m*m/s <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;时间单位为秒，这里周期间的时间差采用系统的时间差，而非设定的周期长度。<br />     <br />     <br />      <br /><strong>每个球、场地独自一线程，完全自主</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;做到新建一个球时仅需往场地一扔，该球即开始负责其本身的运动，而场地要做的仅是定期把所有球画出来而已。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由此可降低整个游戏的复杂性，例如在为球增加新的物理特性时，仅需修改球对象即可。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里球采用的线程是Thread，无需使用SwingWorker，因其不主动更新UI，sleep时间为1ms<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field动画效果采用重写JPanel.paintComponent(Graphics g)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并使用一swing.Timer定期更新画面（field.repaint()），该Timer测试过最小周期为15ms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以画面fps大约为65<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里也可以采用Thread+sleep或java.util.Timer更新画面，但要注意在EDT里更新UI<br />    <br />    <br />     <br /><strong>各类简要说明：</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ball：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;球对象，负责模拟该球所应该具有的所有物理特征（运动、碰撞、受力等）<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;场地，只有一个场地，负责定时依据各个球体位置绘制出球体<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyBall：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关键球，继承自Ball，仅是重写了受用户力处理方法和获取球质量方法<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collision_Monitor：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于碰撞检测和处理的线程，为何使用独立线程处理所有碰撞请见文档<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Events：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处理所有界面事件<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主界面<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Swing app入口<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applet：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applet入口<br />   <br />    <br />    <br /><strong>Ball与Field的沟通：</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过全局变量Main.ball_X[]与Main.ball_Y[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即本球在其运行周期结束后确定该时刻的实时位置，并把坐标写入这两个变量中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field定时从这两个变量数组中读取全部球的坐标，并绘图。<br /><br /><div style="text-align:center"><a href="attachments/jballfield/Communicate.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/Communicate.gif</a></div><br />    <br />   <br />    <br /><strong>球的一个计算周期：</strong><br /><br /><div style="text-align:center"><a href="attachments/jballfield/formulas.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/formulas.gif</a></div><br />    <br />    <br />    <br />     <br /><strong>碰撞的计算：</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把坐标转成两球碰撞点切线法线的坐标会更好计算，因为这样两球受到的力仅是在法线上，切线上无受力.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以计算动量动能守恒可以仅计算法线上的，把二维转成一维碰撞问题。<br /><br /><div style="text-align:center"><a href="attachments/jballfield/collisi&#111;n_formulas.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/collisi&#111;n_formulas.gif</a></div><br />    <br />   <br /><div style="text-align:center"><a href="attachments/jballfield/collisi&#111;n.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/collisi&#111;n.gif</a></div><br />    <br />    <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以处理碰撞总过程就是：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1，把坐标系转换成切线法线坐标系，计算出新坐标系上两球的x、y方向速度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2，y方向速度保留<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3，x方向速度使用上面推导出的公式计算碰撞后的新速度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4，把坐标系转换回原来正常的坐标系，计算出正常坐标系下两球x、y方向碰撞后的新速度<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转换坐标公式：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div style="text-align:center"><a href="attachments/jballfield/collisi&#111;n_process.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jballfield/collisi&#111;n_process.gif</a></div><br /><br /> <br />完整的说明请下载<a target="_blank" href="attachments/jballfield/JBallField_Specific.doc">设计文档</a>
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=96]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=96]]></guid>
    <dc:subject><![CDATA[J2SE]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-06-24T18:06:39Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[ 笔记 ] Hibernate & JDOM & JDBC & Tomcat6 数据池配置]]></title>
    <description><![CDATA[Hibernate： 
 package hibernate;

import java.util.*;

import org.hibernate.*;
import org.hibernate.cfg.*;


/**
 * 一、配置
 * 
 * 
 * MyEclipse中配置Hibernate： 右击工程-MyEclipse-Add Hibernate Capabitilies
 * 
 * 若选择 use JDBC，则...]]></description>
    <content:encoded><![CDATA[<strong>Hibernate：</strong><br /><blockquote class="ubbCode">
package hibernate;<br /><br />import java.util.*;<br /><br />import org.hibernate.*;<br />import org.hibernate.cfg.*;<br /><br /><br />/**<br /> * 一、配置<br /> * <br /> * <br /> * MyEclipse中配置Hibernate： 右击工程-MyEclipse-Add Hibernate Capabitilies<br /> * <br /> * 若选择 use JDBC，则使用hibernate自带的数据池 <br /> * 若选择 use JDNI，则使用托管环境(Tomcat)数据池<br /> * <br /> * <br /> * 配置对应数据库表的java类和*.hbm.xml文件 <br /> * &nbsp;&nbsp;&nbsp;&nbsp;打开MyEclipse Database Explorer视图 <br /> * &nbsp;&nbsp;&nbsp;&nbsp;右击目标数据表-Hibernate Reverse Engineering<br /> * <br /> * <br /> */<br /><br /><br />/**<br /> * 二、Java中如何使用<br /> * <br /> * <br /> * Hibernate禁止立即自动事务提交模式，即必须使用事务模式 <br /> * &nbsp;&nbsp;（自动事务提交(auto-commit)模式本来是专门为SQL控制台操作设计的）<br /> * <br /> * <br /> * 对于使用托管环境<br /> * &nbsp;&nbsp;（如使用Tomcat或J2EE的数据池），该托管环境会自己负责事务管理 <br /> * &nbsp;&nbsp;&nbsp;&nbsp;所以不用声明事务，甚至session.fluse()也会自动完成。<br /> &nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp; Session session = HibernateSessionFactory.getSession();<br />  &nbsp;&nbsp;&nbsp;&nbsp; // 处理数据<br /> &nbsp;&nbsp;&nbsp;&nbsp; session.flush();<br />  &nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />  &nbsp;&nbsp;&nbsp;&nbsp; <br /> * <br /> * <br /> * 对于使用非托管环境<br /> * &nbsp;&nbsp; (如直接连接即使用hibernate自身的数据池管理），要显式声明事务<br />  <br />  &nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession(); <br />  &nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;transaction = session.beginTransaction();<br />   &nbsp;&nbsp;&nbsp;&nbsp;// 处理数据<br />  &nbsp;&nbsp;&nbsp;&nbsp;transaction.commit(); <br />  &nbsp;&nbsp;&nbsp;&nbsp;// 这里不需要再session.flush(); commit()已经flush()了<br />  &nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />  <br /> * <br /> * <br /> * 查询可以不用事务<br /> * <br /> */<br /><br /><br />/**<br /> * 三、关于新建对象时分配ID的方式：<br /> * <br /> * <br /> * &nbsp;&nbsp;&nbsp;&nbsp;increment&nbsp;&nbsp;根据表中最大ID+1生成，表ID类型为Integer，不推荐使用，<br /> * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当有多个线程同时写入时可能会生成同一ID<br /> * &nbsp;&nbsp;&nbsp;&nbsp;identity&nbsp;&nbsp;让数据库本身生成ID，如数据库设置成&quot;Auto increment&quot;<br /> * &nbsp;&nbsp;&nbsp;&nbsp;uuid.hex&nbsp;&nbsp;随机生成一 十六进制字符串(32位)<br /> * &nbsp;&nbsp;&nbsp;&nbsp;assigned&nbsp;&nbsp;由所对应的类自己设定id为多少<br /> */<br /><br /><br />/**<br /> * 四、session使用方式？<br /> * <br /> * <br /> * 不使用session-per-operation模式<br /> * &nbsp;&nbsp;&nbsp;&nbsp;也就是说，在单个线程中， 不要因为一次简单的数据库调用， 就打开和关闭一次Session！ <br /> * &nbsp;&nbsp;&nbsp;&nbsp;数据库事务也是如此。<br /> * <br /> * <br /> * 最常用的模式是 每个请求一个会话(session-per-request)<br /> * &nbsp;&nbsp;&nbsp;&nbsp;在这种模式下，来自客户端的请求被发送到服务器端，一个新的Hibernate Session被打开， <br /> * &nbsp;&nbsp;&nbsp;&nbsp;并且执行这个操作单元中所有的数据库操作。 一旦操作完成（同时发送到客户端的响应也准备就绪） <br /> * &nbsp;&nbsp;&nbsp;&nbsp;session被同步，然后关闭。<br /> * <br /> */<br /><br /><br />/**<br /> * 五、笔记<br /> * <br /> * <br /> * 持久化时Hibernate使用POJO的getXXX()方法获取数据并保存到数据库，不是直接访问变量成员<br /> * <br /> * <br /> * 关于POJO如何与数据库中记录一一对应起来：<br /> * <br /> * &nbsp;&nbsp;一，即时形式<br /> * &nbsp;&nbsp;&nbsp;&nbsp;即同一个session时（如调用flush()、delete()）<br /> * &nbsp;&nbsp;&nbsp;&nbsp;此时每一个POJO对象对应一条记录，内部对应方式，改不了<br /> * &nbsp;&nbsp;&nbsp;&nbsp;此时调用POJO.setId(4);会抛出异常<br /> * <br /> * &nbsp;&nbsp;二，脱管形式<br /> * &nbsp;&nbsp;&nbsp;&nbsp;即不同session时（如调用update()、delete()）<br /> * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session都变了，Hibernate是根据什么决定这个POJO对象对应于表中哪个记录呢？<br /> * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答曰：根据这个POJO的ID域<br /> * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如原test的Id为4，更改数据后调用test.setId(1);<br /> * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则session.update(test);后更改的是1的数据而非4的<br /> * <br /> */<br /><br /><br />public class Main {<br /><br />&nbsp;&nbsp;/** <br />&nbsp;&nbsp; * 查询<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 关于HQL查询语句<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * Query query = session.createQuery(&quot;from Test where age&gt;21&quot;);<br />&nbsp;&nbsp; * 以上&quot;&quot;内的就是HQL语句<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 当有select子句时<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;如<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;session.createQuery(&quot;select count(*) from Test&quot;);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;session.createQuery(&quot;select name,age from Test&quot;);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;则iterate.next()返回的不是POJO<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;而是普通类型<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如第一条返回类型为一Integer<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二条返回类型为一Object[]，object[0]类型为String，object[1]类型为Integer<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 当无select子句时<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;如<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;session.createQuery(&quot;from Test where age&gt;21&quot;);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;则返回的是POJO<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;Test test = (Test) iterate.next();<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * HQL中加入变量<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp;  &nbsp;&nbsp;Query query = session.createQuery(&quot;from Test where name = :name and age = :age&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;query.setString(&quot;name&quot;, &quot;JTL&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(&quot;age&quot;, 25);<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * Date:    Dec 1, 2007<br />&nbsp;&nbsp; *<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;public static void printAll() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// Test 头字母要大写<br />&nbsp;&nbsp;&nbsp;&nbsp;Query query = session.createQuery(&quot;from Test&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Iterator iterate = query.iterate();<br />&nbsp;&nbsp;&nbsp;&nbsp;while (iterate.hasNext()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test test = (Test) iterate.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.print();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br /><br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * 添加<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * Date:    Dec 1, 2007<br />&nbsp;&nbsp; *<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;public static void addNew() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;Transaction transaction = session.beginTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Test test = new Test(&quot;newOne&quot;, 21);<br />&nbsp;&nbsp;&nbsp;&nbsp;session.save(test);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * 修改<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 有两种更新方式：<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;一、即时形式，session.flush();<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;二、脱管形式，session.update(Object);<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 一，即时形式：<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;用于同一会话中<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从一会话中取出POJOs，修改这些POJOs，即时调用同一会话的<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.fluse();<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把该会话取出的所有POJOs所做的更改保存起来<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 二，脱管形式<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;用于不同会话中<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如从一会话中取出POJOs，关闭该会话<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时这些POJOs还存于内存中<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个小时后用户更改这些POJOs，更改完后建立一新会话，调用<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessino.update(要更新的POJO);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把更新的POJO保存起来<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 关于POJO如何与数据库中记录一一对应起来：<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * &nbsp;&nbsp;一，即时形式<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;即同一个session时（如调用flush()、delete()）<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;此时每一个POJO对象对应一条记录，内部对应方式，改不了<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;此时调用POJO.setId(4);会抛出异常<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * &nbsp;&nbsp;二，脱管形式<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;即不同session时（如调用update()、delete()）<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session都变了，Hibernate是根据什么决定这个POJO对象对应于表中哪个记录呢？<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答曰：根据这个POJO的ID域<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如原test的Id为4，更改数据后调用test.setId(1);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则session.update(test);后更改的是1的数据而非4的<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * Date:    Dec 1, 2007<br />&nbsp;&nbsp; *<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;// 即时形式<br />&nbsp;&nbsp;public static void edit_flush() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;Transaction transaction = session.beginTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Query query = session.createQuery(&quot;from Test&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Test test = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;Iterator iterate = query.iterate();<br />&nbsp;&nbsp;&nbsp;&nbsp;// 所有age-1<br />&nbsp;&nbsp;&nbsp;&nbsp;while (iterate.hasNext()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test = (Test) iterate.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.setAge(test.getAge() - 1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 把该会话取出的所有POJOs所做的更改保存起来<br />&nbsp;&nbsp;&nbsp;&nbsp;session.flush();<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;// 脱管形式<br />&nbsp;&nbsp;public static void edit_update() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 找不到时返回null<br />&nbsp;&nbsp;&nbsp;&nbsp;Test test = (Test) session.get(Test.class, 4);<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 已经关闭session，但test对象仍在内存中供用户操作<br />&nbsp;&nbsp;&nbsp;&nbsp;test.setName(&quot;任盈盈&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;test.setAge(20);<br />&nbsp;&nbsp;&nbsp;&nbsp;// 改来改去<br />&nbsp;&nbsp;&nbsp;&nbsp;test.setName(&quot;令狐冲&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;test.setAge(24);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 一个小时后用户决定要保存这个对象<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 建立一新session<br />&nbsp;&nbsp;&nbsp;&nbsp;session = HibernateSessionFactory.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;Transaction transaction = session.beginTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 保存这个POJO，根据Id修改数据库中对应记录<br />&nbsp;&nbsp;&nbsp;&nbsp;session.update(test);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * 删除<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * 关于POJO如何与数据库中记录一一对应起来：<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * &nbsp;&nbsp;一，即时形式<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;即同一个session时（如调用flush()、delete()）<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;此时每一个POJO对象对应一条记录，内部对应方式，改不了<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;此时调用POJO.setId(4);会抛出异常<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * &nbsp;&nbsp;二，脱管形式<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;即不同session时（如调用update()、delete()）<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session都变了，Hibernate是根据什么决定这个POJO对象对应于表中哪个记录呢？<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答曰：根据这个POJO的ID域<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如原test的Id为4，更改数据后调用test.setId(1);<br />&nbsp;&nbsp; * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则session.update(test);后更改的是1的数据而非4的<br />&nbsp;&nbsp; * <br />&nbsp;&nbsp; * Date:    Dec 1, 2007<br />&nbsp;&nbsp; *<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;// 即时形式<br />&nbsp;&nbsp;public static void delete() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;Transaction transaction = session.beginTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Test test = (Test) session.get(Test.class, 7);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// setId会抛出异常<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;test.setId(17);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;session.delete(test);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;// 脱管形式<br />&nbsp;&nbsp;public static void delete2() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Test test = (Test) session.get(Test.class, 10);<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 更改Id域<br />&nbsp;&nbsp;&nbsp;&nbsp;test.setId(12);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 一个小时后，一个新的session<br />&nbsp;&nbsp;&nbsp;&nbsp;session = HibernateSessionFactory.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;Transaction transaction = session.beginTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 根据Id域去删除，这里删的是12而非10<br />&nbsp;&nbsp;&nbsp;&nbsp;session.delete(test);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;public static void main(String... arg) {<br /><br /><br />&nbsp;&nbsp;}<br />}
</blockquote><br />    <br />   <br />     <br /><strong>JDOM：</strong><br /><blockquote class="ubbCode">
package hartech;<br /><br />import org.jdom.*;<br /><br />import java.io.*;<br />import java.util.*;<br />import java.net.*;<br /><br />/**<br />&nbsp;&nbsp;* &lt;p&gt;Title: JDOM examples &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Description:<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* JDOM安装：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*&nbsp;&nbsp; 开发端（JBuilder2006）：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从jdom.org下载最新的jdom.zip<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把jdom.jar复制到JBuilder2006/lib<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把jdom.zip复制到JBuilder2006/extras<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JBuilder内tools-configure-libraries左边找到JDOM<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在右边修改其Source、Document路径为新加入的jdom.zip内的src、doc路径<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启用JDOM：右击工程属性-Paths-Required Libraries-Add 加入JDOM<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &nbsp;&nbsp;客户端（两种方法）：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1，修改JRE：把jdom.jar复制到用户JRE/lib/ext<br />&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2，绑定JDOM：在建立jar文件时，Dependencies选择&quot;Dependencies &amp; Resources&quot;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;/p&gt;<br />&nbsp;&nbsp;* <br />&nbsp;&nbsp;* &lt;p&gt;Website: www.hartech.cn &lt;/p&gt;<br /> &nbsp;&nbsp;* &lt;p&gt;Page: <a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=94">http://www.hartech.cn/blog/blogview.asp?logID=94</a> &lt;/p&gt;<br />&nbsp;&nbsp;* <br />&nbsp;&nbsp;* &lt;p&gt;Date: 2007-02-25 &lt;/p&gt;<br />&nbsp;&nbsp;*/<br /><br />public class JDom {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static Document readFile() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可从任一InputStream、Reader、File、URL流中读取<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//doc = builder.build(new URL(&quot;<a target="_blank" href="http://hartech.cn/blog/feedrss2.asp&quot;));">http://hartech.cn/blog/feedrss2.asp&quot;));</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc = builder.build(new FileReader(&quot;Data/xmlsrc.xml&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (JDOMException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return doc;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void printXML(Document doc) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (doc == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc = readFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter outputter = new XMLOutputter();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// format 也可自定义缩进字符，是否另起一行，采用的编码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Format format = Format.getPrettyFormat();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.setFormat(format);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc, System.out);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void saveToFile() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc = readFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置DOCTYPEs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocType dtd = new DocType(&quot;docTYPE&quot;, &quot;docTYPE.dtd&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.setDocType(dtd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter outputter = new XMLOutputter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.setFormat(Format.getPrettyFormat());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream out = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out = new FileOutputStream(&quot;Data/newXML.xml&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可输入到任一OutputStream流内<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc, out);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (FileNotFoundException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void browseXML() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc = readFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element el = doc.getRootElement();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 以root这个标签为例，其他标签也是同样用法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(el.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(el.getTextTrim());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(el.getAttributeValue(&quot;title&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(el.getChild(&quot;slide&quot;).getChild(&quot;title&quot;).getText());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 浏览其所有子属性<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List ls = el.getAttributes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator il = ls.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Attribute e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (il.hasNext()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e = (Attribute) il.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// e.getIntValue,getDoubleValue...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;Name: &quot; + e.getName() + &quot;\tValue: &quot; + e.getValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 浏览其所有子内容（Content：标签、注释、PI等）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ls = el.getContent();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;il = ls.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content o;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (il.hasNext()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o = (Content) il.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Comment) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;Comment: &quot; + ( (Comment) o).getText());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (o instanceof ProcessingInstruction) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;PI: &quot; + ( (ProcessingInstruction) o).getValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (o instanceof Element) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;Element: &quot; + ( (Element) o).getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void editXML() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc = readFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element el = doc.getRootElement();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.setName(&quot;newName&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// setText会把所有的Content（子标签、注释等）替换掉<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//el.setText(&quot;new Text&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// append text(使用CDATA)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.addContent(new CDATA(&quot;append Text&quot;));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加入标签、注释(都是加到最后)(可直接加入 Name Spaces)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.addContent(new Element(&quot;newElement&quot;, &quot;prefix&quot;, &quot;URL....&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.addContent(new Comment(&quot;new Comment&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加入到指定位置(从1开始计数)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.addContent(1, new Element(&quot;indexedElement&quot;));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加入属性（已存在同名的则替换）（加入到最后）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.setAttribute(new Attribute(&quot;name1&quot;, &quot;1111&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.setAttribute(&quot;title&quot;, &quot;222&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除第一个&quot;slide&quot;的标签<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.removeChild(&quot;slide&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除所有叫&quot;slide&quot;的标签<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.removeChildren(&quot;slide&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除属性(String)(Attribute)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.removeAttribute(&quot;title&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除指定Content<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.addContent(3, new Element(&quot;toRemove&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element e = (Element) el.getContent(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.removeContent(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除所有Content<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.removeContent();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printXML(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 验证XML文件语法是否正确，是否符合对应的DTD声明<br />&nbsp;&nbsp;&nbsp;&nbsp;public static boolean validateXML(File src) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// JDOM本身不提供验证DTD功能，会自动忽略DTD声明，使用其他parser来验证<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// true 打开验证功能<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.build(src);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (JDOMException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 验证内存中的Document是否符合对应的DTD声明<br />&nbsp;&nbsp;&nbsp;&nbsp;public static boolean validateXML(Document doc) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String str = new XMLOutputter().outputString(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把字符串变成字符流<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringReader stream = new StringReader(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.build(stream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (JDOMException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String ...args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
</blockquote><br />    <br />    <br />    <br />    <br />    <br /><strong>JDBC</strong><br /><blockquote class="ubbCode">
package hartech;<br /><br />import java.sql.*;<br />import javax.sql.*;<br /><br />import java.io.*;<br /><br />/**<br />&nbsp;&nbsp;* &lt;p&gt;Title: JDBC examples &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Description:<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* JDBC中：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 要查询：<br />&nbsp;&nbsp;*        使用Statement执行SQL查询语句，使用返回的ResultSet对象处理得到的数据<br />&nbsp;&nbsp;*           （下面 printInfos()）<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 要更新：（修改，插入，删除，建表）<br />&nbsp;&nbsp;*        1，使用Statement执行SQL查询语句，再使用返回的ResultSet对象对数据进行更新操作<br />&nbsp;&nbsp;*           （下面 edit()、insert()、delete()）<br />&nbsp;&nbsp;*        2，使用PreparedStatement预编译要执行更新的SQL语句，使用setXXX()方法设变量值<br />&nbsp;&nbsp;*           （下面 usePreparedStatementTransaction()）<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 对于数据冲突（数据同步）的解决方法：<br />&nbsp;&nbsp;*        1，使用数据库锁<br />&nbsp;&nbsp;*        2，使用会话（下面 usePreparedStatementTransaction()）<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* PreparedStatement 与 会话：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* *** 使用 PreparedStatement 对象 ***<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 当同一个SQL语句要执行多次时，这个效率更高<br />&nbsp;&nbsp;* 因为它对字符串的SQL语句只编译一次（在创建该对象时），而之前的方法每次都要编译一次<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* *** 使用会话 ***<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 用于要更新一系列数据时，对于查询数据无用<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 一般情况是每执行一次更新就对数据库修改一次，这些操作是间断，所以有可能被其他操作插入<br />&nbsp;&nbsp;* 比如你在更新一个学生的所有信息，有可能修改到一半时有人来查该学生所有信息<br />&nbsp;&nbsp;* 这是他得到的是前一半是刚更新的，后一半则是还未更新的信息<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 解决方法有两个：<br />&nbsp;&nbsp;* 1，使用数据锁对整条记录上锁，这样别的操作（如查询）在当前操作未完成前是被阻塞的<br />&nbsp;&nbsp;* 2，使用会话，即把不要一个信息项一个信息项的修改数据库，而是把所有要修改的项准备好<br />&nbsp;&nbsp;*            最后打包一次性发送给DBMS修改整一条信息<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 使用方法：<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 首先设置 con.setAutoCommit(false);<br />&nbsp;&nbsp;*         因为默认的连接为每次执行完 update 语句后都自动更新到数据库<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* /...... 这里执行一系列数据库更新操作....../<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 最后把所有操作打包一次性发送到DBMS：<br />&nbsp;&nbsp;* con.commit();<br />&nbsp;&nbsp;* con.setAutoCommit(true);<br /><br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;/p&gt;<br />&nbsp;&nbsp;* <br />&nbsp;&nbsp;* &lt;p&gt;Website: www.hartech.cn &lt;/p&gt;<br /> &nbsp;&nbsp;* &lt;p&gt;Page: <a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=94">http://www.hartech.cn/blog/blogview.asp?logID=94</a> &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Date: 2007-02-09 &lt;/p&gt;<br />&nbsp;&nbsp;*/<br /><br />public class JDBC {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 建立连接，返回con<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* using JDBC-ODBC driver<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param dbPath String   目标数据库相对于 启动本程序的地方 的路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @return Connection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static synchronized Connection getConnection(String dbPath) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 指定驱动程序，使用JDBC－ODBC桥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String dirverName = &quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 连接到DBMS时使用的路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 也可： DriverManager.getConnection(&quot;jdbc:odbc:myDB_Name&quot;,&quot;&quot;,&quot;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//       这样要在控制面板数据源里制定该数据库位置并把其命名为 myDB_Name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String url = &quot;jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbPath;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加载驱动程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(dirverName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (ClassNotFoundException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 找不到该驱动程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 连接到DBMS,(url, user, password)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con = DriverManager.getConnection(url, &quot;&quot;, &quot;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 连接失败，可能找不到数据库、数据库密码错误、数据库禁止访问<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex1.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return con;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 打印列表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void printInfo() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;\n-------------Print Infos---------------&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = getConnection(&quot;Data/coffee.mdb&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获得用于执行sql语句的Statement对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 指针移动类型： ResultSet.TYPE_FORWARD_ONLY,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//                        TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 操作类型： ResultSet.CONCUR_READ_ONLY , CONCUR_UPDATABLE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一般使用 ResultSet.TYPE_SCROLL_SENSITIVE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet.CONCUR_READ_ONLY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 执行sql语句<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet srs = stmt.executeQuery(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;select COF_NAME,price from COFFEES order by cof_name&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (srs.next()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可以指定字符名称（大小写忽略），也可指定获取哪一列数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(srs.getRow() + &quot;:\t&quot; + srs.getString(&quot;cof_name&quot;) + &quot;\t\t&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.getDouble(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 更新数据内容<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void edit() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p(&quot;\n----------- Edit ----------------&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = getConnection(&quot;Data/coffee.mdb&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获得用于执行sql语句的Statement对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 指针移动类型： ResultSet.TYPE_FORWARD_ONLY,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//                        TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 操作类型： ResultSet.CONCUR_READ_ONLY , CONCUR_UPDATABLE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一般使用 ResultSet.TYPE_SCROLL_SENSITIVE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet.CONCUR_UPDATABLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet srs = stmt.executeQuery(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;select cof_name,price from coffees order by cof_name&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 首先指向要更新的那一行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可用名称字符串或序号(从1开始)指定要更改的项<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateString(&quot;cof_Name&quot;, &quot;aa111&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取消所做更新<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.cancelRowupdates();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateDouble(2, 777117);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// **** 在移动指针到别的地方之前要调用 updateRow() 保存更改 ****<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateRow();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateString(1, &quot;13ctt1&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateDouble(2, 8888);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 要更新生效，srs.updateRow() 和 con.close() 缺一不可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// updateRow()用于把更新提交到ResultSet对象内，con.close()把更新保存到数据库内<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateRow();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 删除指定行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void delete() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = getConnection(&quot;Data/coffee.mdb&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet.CONCUR_UPDATABLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet srs = stmt.executeQuery(&quot;select cof_name,price from coffees&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把指针定位到要删除的那行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.absolute(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.deleteRow();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 必须执行 con.close() 否则不删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 插入新记录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void insert() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = getConnection(&quot;Data/coffee.mdb&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet.CONCUR_UPDATABLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet srs = stmt.executeQuery(&quot;select cof_name,price from coffees&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.absolute(2);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把指针移动到插入缓冲区（一个ResultSet对象有一个，行号为0）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.moveToinsertRow();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 写入各项数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateString(1, &quot;x665588884x&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.updateDouble(&quot;price&quot;, 8888);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把所有数据一次性插入ResultSet表内，但在调用con.close()前还没入数据库表内<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.insertRow();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把指针移回原来的位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srs.moveToCurrentRow();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 必须执行 con.close() 否则无效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* *** 使用 PreparedStatement 对象 ***<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 当同一个SQL语句要执行多次时，这个效率更高<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 因为它对字符串的SQL语句只编译一次（在创建该对象时），而之前的方法每次都要编译一次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* *** 使用会话 ***<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 用于要更新一系列数据时，对于查询数据无用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 一般情况是每执行一次更新就对数据库修改一次，这些操作是间断，所以有可能被其他操作插入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 比如你在更新一个学生的所有信息，有可能修改到一半时有人来查该学生所有信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 这是他得到的是前一半是刚更新的，后一半则是还未更新的信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 解决方法有两个：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 1，使用数据锁对整条记录上锁，这样别的操作（如查询）在当前操作未完成前是被阻塞的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 2，使用会话，即把不要一个信息项一个信息项的修改数据库，而是把所有要修改的项准备好<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*            最后打包一次性发送给DBMS修改整一条信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 使用方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 首先设置 con.setAutoCommit(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*         因为默认的连接为每次执行完 update 语句后都自动更新到数据库<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* /...... 这里执行一系列数据库更新操作....../<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 最后把所有操作打包一次性发送到DBMS：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* con.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* con.setAutoCommit(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void usePreparedStatementTransaction() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con = getConnection(&quot;Data/coffee.mdb&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 使用&#39;?&#39;做为变量，第一个&#39;?&#39;序号为1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement updateSales = con.prepareStatement(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;update coffees set price= ? where cof_name like ? &quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 使用会话<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(false);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一次更新<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.setInt(1, 7115588);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.setString(2, &quot;colombian&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.executeupdate();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 二次更新<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.setString(2, &quot;espr%&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 此时price仍保留上次7888的值，直到被重设或执行 clearParameters()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.executeupdate();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 把上面一系列更新打包一次性发送给DBMS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateSales.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String ...args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.p( (char) 47);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
</blockquote><br />    <br />    <br />    <br />    <br />    <br /><strong>例子所使用的XML文件</strong><br /><blockquote class="ubbCode">
&lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?&gt;<br />&lt;!--  A SAMPLE set of slides  --&gt;<br />&lt;slideshow title=&quot;Sample Slide Show&quot; date=&quot;Date of publication&quot; author=&quot;Yours Truly&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- PROCESSING INSTRUCTION --&gt;<br /><br />&lt;?my.presentation.Program QUERY=&quot;exec, tech, all&quot;?&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- TITLE SLIDE --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;slide type=&quot;all&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Wake up to WonderWidgets!&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/slide&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- OVERVIEW --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;slide type=&quot;all&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Overview&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;      Why<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;em&gt;WonderWidgets&lt;/em&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are great<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;      Who<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;em&gt;buys&lt;/em&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WonderWidgets<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/slide&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;slide type=&quot;exec&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Financial Forecast&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;      Market Size<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predicted!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;Anticipated Penetration&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;Expected Revenues&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;Profit Margin&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/slide&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;slide type=&quot;tech&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;How it Works&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;First we fozzle the frobmorten&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;Then we framboze the staten&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;Finally, we frenzle the fuznaten&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[Diagram:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frobmorten &lt;------------ fuznaten<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|            &lt;3&gt;        ^<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &lt;1&gt;                   |   &lt;1&gt; = fozzle<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V                       |   &lt;2&gt; = framboze<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staten--------------------+   &lt;3&gt; = frenzle<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;2&gt; ]]&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/slide&gt;<br />&lt;/slideshow&gt;<br />
</blockquote><br />    <br />    <br />    <br /><br />    <br /><strong>Tomcat6数据池的配置</strong><br /><blockquote class="ubbCode">
/**<br /> * <br /> * 配置Tomcat6的数据池：<br /> * <br /> * <br /> * 一，配置tomcat下的conf下的context.xml文件,在之间添加连接池如下<br /> * <br /> &lt;Resource name=&quot;jdbc/mysql/party&quot;  <br /> auth=&quot;Container&quot;  <br /> type=&quot;javax.sql.DataSource&quot;  <br /> driverClassName=&quot;com.mysql.jdbc.Driver&quot;  <br /> url=&quot;jdbc:mysql://localhost:3306/party&quot;  <br /> username=&quot;root&quot;  <br /> password=&quot;&quot;  <br /> maxActive=&quot;50&quot;  <br /> maxIdle=&quot;10&quot;  <br /> maxWait=&quot;5000&quot; /&gt;<br /> * <br /> * <br /> * 二，配置你的应用下的web.xml中加入（作为第一个子标签）<br /> * <br /> * &nbsp;&nbsp;   <br /> &lt;resource-ref&gt;  <br /> &lt;description&gt;DB Connection&lt;/description&gt;  <br /> &lt;res-ref-name&gt;jdbc/mysql/party&lt;/res-ref-name&gt;  <br /> &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;  <br /> &lt;res-auth&gt;Container&lt;/res-auth&gt;  <br /> &lt;/resource-ref&gt;  <br /> *<br /> *<br /> * 三，Java中获取连接<br /> * <br /> InitialContext context = new InitialContext();   <br /> DataSource dataSource = (DataSource)context.lookup(&quot;java:comp/env/jdbc/mysql/party&quot;);   <br /> Connection conn = dataSource.getConnection();  <br /> * <br /> * <br /> * 四，如何使用本类<br /> * <br /> <br /> Connection conn = MySQLConnectionPool.getConnection();<br /><br /> Statement stmt = conn.createStatement();<br /><br /> String strSql = &quot; select * from test&quot;;<br /><br /> ResultSet rs = stmt.executeQuery(strSql);<br /><br /> // 使用完后记得用下面语句把连接交还给Tomcat，否则Tomcat中连接数会一直增加<br /> conn.close();<br /> <br /> * <br /> * <br /> * Date:    2007-11-1<br /> */<br />
</blockquote>
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=94]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=94]]></guid>
    <dc:subject><![CDATA[J2EE]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-03-25T22:02:21Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[Flash] 多路口交通灯演示系统]]></title>
    <description><![CDATA[用于演示简单的交通运行情况


 attachments/TrafficDemo/image/tip.gif 


 
 进入演示界面 

源文件下载：
 Click to Download 

 
 
 
 
 
 界面说明： 

红灯停车，绿灯通行，全绿的红绿灯台为全通行，即该红绿灯失效，下面的车可以自由行驶

...]]></description>
    <content:encoded><![CDATA[用于演示简单的交通运行情况<br /><br /><br /><div style="text-align:center"><a href="attachments/TrafficDemo/image/tip.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/TrafficDemo/image/tip.gif</a></div><br /><br /><br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">演示与下载:</div>
<div><br /><a target="_blank" href="attachments/TrafficDemo/">进入演示界面</a><br /><br />源文件下载：<br /><a href="attachments/TrafficDemo/TrafficLight.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>     <br />     <br />     <br />     <br /><strong>界面说明：</strong><br /><br />红灯停车，绿灯通行，全绿的红绿灯台为全通行，即该红绿灯失效，下面的车可以自由行驶<br /><br />蓝色的车为正常状态，红色为故障状态<br /><br />每条路的入口处都有一拥塞指示器，指明该条路上的拥塞情况（蓝色为轻微，黄色中等，红色严重），右上角的指示器显示全地图的拥塞情况<br />     <br />     <br />     <br /><strong>操作说明：</strong><br /><br /><br /><div style="text-align:center"><a href="attachments/TrafficDemo/image/readme.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/TrafficDemo/image/readme.gif</a></div><br />     <br />     <br />          <br />     <br /><strong>四种交通灯变换类型：</strong><br /><br /><br /><div style="text-align:center"><a href="attachments/TrafficDemo/image/type.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/TrafficDemo/image/type.gif</a></div><br />     <br />     <br />          <br /><strong>实现的规则：</strong><br /><br /><br />一，每一辆车：<br /><br />1，车任意时刻的速度取最大速度和最小速度之间的随机数<br /><br />2，车的最大速度为其所在车道设定的速度，每条车道可以不同<br /><br />3，最小速度为最大速度的1/3<br /><br />4，始终保持与其之前一辆车的车距，当车速过快时，允许小几率出现超红灯、追尾，不允许越过前面的车<br /><br />5，当与前面的车的车距为设定车距的4倍以内时，该车换成以最小车速行驶，当车距为设定车距以内时，该车停止行驶<br /><br />6，当行驶到红灯区前一定距离并且红灯亮时，该车停止行驶<br /><br />7，本车以设定的概率出现故障<br /><br />8，车正常时，当用户点击该车辆时，该车辆出现故障，故障时点击该车恢复正常<br /><br />9，出现故障时，该车停止行驶，车颜色由蓝色变为红色，恢复正常时变回蓝色<br /><br />10，当出现故障后经过设定的时间，该车恢复正常<br />    <br />     <br /> 二，每一个红绿灯<br /><br />1，当为全绿色时为全通型，即该红绿灯失效，下面的车可以自由行驶<br /><br />2，自备独立的一个定时器<br /><br />3，当定时器到达设定时间时，切换红绿灯方向<br /><br />4，当用户点击该红绿灯时，切换红绿灯方向<br /><br />5，当&quot;总红灯方案控制器&quot;通知该红灯时，切换红绿灯方向<br /><br />6，当切换红绿灯方向时，通知其下面的四条道路的车辆当前的红绿灯状态，并且定时器置零<br />    <br />     <br /> 三，其它：<br /><br />1，拥塞定义：所停下来的车辆总数除以总车数<br /><br />2，&quot;总红灯方案控制器&quot;控制所有的红绿灯，再由红绿灯控制其下方汽车<br /><br />3，各道路上各自的发车率、车速，控制面板上的总发车率、总车速都可调节，实现各个道路的发车率和车速度可以各不相同，同时又能受全局控制<br /><br />4，可以尝试不同的红灯切换组合和切换速度对交通所带来的影响<br /><br />5，改变各个道路的发车率和车速可模拟一些高速公路（车速相对快）与一般公路的相互影响，闹市区街道（发车率高）与一般街道的相互影响<br /><br />6，点击车辆使其出现故障可观察出现故障后带来的连锁反应<br />      <br />      <br />      <br />      <br />      <br /><strong>部分代码：</strong><br />      <br /><blockquote class="ubbCode">
1，&nbsp;&nbsp;控制车的距离，红灯处理和故障处理<br /><br />// 当前第i辆车的运行情况<br />&nbsp;&nbsp;&nbsp;&nbsp;// <br />&nbsp;&nbsp;&nbsp;&nbsp;// 判断是否红灯<br />&nbsp;&nbsp;&nbsp;&nbsp;stopCar = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;for (j=1; j&lt;=3; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (eval(&quot;car&quot;+i)._x&gt;(eval(&quot;redLine&quot;+j)._x-stop_interval) &amp;&amp; eval(&quot;car&quot;+i)._x&lt;(eval(&quot;redLine&quot;+j)._x) &amp;&amp; eval(&quot;redLine&quot;+j).redOn == 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopCar = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if (_root.car_autoBroken_on == 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 车子出现故障的概率为1秒内(1/_root.car_broken_rate)次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (random(_root.car_broken_rate*100) == 1 &amp;&amp; eval(&quot;car&quot;+i)._x&gt;car_width &amp;&amp; eval(&quot;car&quot;+i)._x&lt;(load_length-car_width)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).stopCar = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).gotoAndStop(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;// 车故障自动恢复<br />&nbsp;&nbsp;&nbsp;&nbsp;if (eval(&quot;car&quot;+i).stopCar == 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (eval(&quot;car&quot;+i).count&gt;_root.car_recover_time) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).count = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).stopCar = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i).gotoAndStop(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;// 当非红灯且车子不出故障时可行<br />&nbsp;&nbsp;&nbsp;&nbsp;if (stopCar == 0 &amp;&amp; eval(&quot;car&quot;+i).stopCar == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moveCar();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;// 当驶出地图时<br />&nbsp;&nbsp;&nbsp;&nbsp;if (eval(&quot;car&quot;+i)._x&gt;(load_length+car_width*5)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i)._visible = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeMovieClip(eval(&quot;car&quot;+i));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car_out++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />2，&nbsp;&nbsp;控制车速度<br /><br />function moveCar() {<br />&nbsp;&nbsp;// 保持车距，当小于四倍车距时以最低速行驶，小于一倍车距时停下<br />&nbsp;&nbsp;if ((eval(&quot;car&quot;+(i-1))._x-eval(&quot;car&quot;+i)._x)&gt;(_root.car_interval*4+car_width) || i == (car_out+1)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i)._x += random(car_maxSpeed-car_maxSpeed*car_minK)+car_maxSpeed*car_minK;<br />&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;if ((eval(&quot;car&quot;+(i-1))._x-eval(&quot;car&quot;+i)._x)&gt;(_root.car_interval+car_width)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;car&quot;+i)._x += car_maxSpeed*car_minK;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /><br /><br />3，&nbsp;&nbsp;红灯的事件定义<br /><br />onClipEvent (load) {<br />&nbsp;&nbsp;count = 0;<br />&nbsp;&nbsp;cancel_redLight();<br />&nbsp;&nbsp;pass_WE = 1;<br />&nbsp;&nbsp;// 通知使得该红灯下的南北走向畅通<br />&nbsp;&nbsp;function getPass_NS() {<br />&nbsp;&nbsp;&nbsp;&nbsp;pass_WE = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_W_1.redLine3.redOn = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_E_1.redLine1.redOn = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_S_1.redLine1.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_N_1.redLine3.redOn = 0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;// 通知使得该红灯下的东西走向畅通<br />&nbsp;&nbsp;function getPass_WE() {<br />&nbsp;&nbsp;&nbsp;&nbsp;pass_WE = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_W_1.redLine3.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_E_1.redLine1.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_S_1.redLine1.redOn = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_N_1.redLine3.redOn = 1;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;// 改变方向<br />&nbsp;&nbsp;function change_direction() {<br />&nbsp;&nbsp;&nbsp;&nbsp;if (pass_WE == 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getPass_NS();<br />&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getPass_WE();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;// 使红绿灯失效<br />&nbsp;&nbsp;function cancel_redLight() {<br />&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_W_1.redLine3.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_E_1.redLine1.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_S_1.redLine1.redOn = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.load_N_1.redLine3.redOn = 0;<br />&nbsp;&nbsp;}<br />}<br />on (release) {<br />&nbsp;&nbsp;count = 0;<br />&nbsp;&nbsp;change_direction();<br />}<br /><br /><br />4,红灯总控制器的代码<br /><br />// 控制全部交通灯的变换，每个交通灯都有自己的独立的计时器，每隔lightChangeSpeed时间自动切换<br />onEnterFrame = function () {<br />&nbsp;&nbsp;if (_root.cancelAllLights == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;// 遍历所有九个交通灯<br />&nbsp;&nbsp;&nbsp;&nbsp;for (i=1; i&lt;=3; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j=1; j&lt;=3; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;Light_&quot;+i+j).count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (eval(&quot;Light_&quot;+i+j).count&gt;_root.lightChangeSpeed) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;Light_&quot;+i+j).count = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;Light_&quot;+i+j).change_direction();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />};<br /><br /><br />5,方案之一莲花型的事件处理<br /><br />on (click) {<br />&nbsp;&nbsp;_root.cancelAllLights = 0;<br />&nbsp;&nbsp;// 全部计时器置零<br />&nbsp;&nbsp;_parent.Light_11.count = 0;<br />&nbsp;&nbsp;_parent.Light_12.count = 0;<br />&nbsp;&nbsp;_parent.Light_13.count = 0;<br />&nbsp;&nbsp;_parent.Light_21.count = 0;<br />&nbsp;&nbsp;_parent.Light_22.count = 0;<br />&nbsp;&nbsp;_parent.Light_23.count = 0;<br />&nbsp;&nbsp;_parent.Light_31.count = 0;<br />&nbsp;&nbsp;_parent.Light_32.count = 0;<br />&nbsp;&nbsp;_parent.Light_33.count = 0;<br />&nbsp;&nbsp;// Group 1<br />&nbsp;&nbsp;_parent.Light_12.getPass_WE();<br />&nbsp;&nbsp;_parent.Light_21.getPass_WE();<br />&nbsp;&nbsp;_parent.Light_23.getPass_WE();<br />&nbsp;&nbsp;_parent.Light_32.getPass_WE();<br />&nbsp;&nbsp;// Group 2<br />&nbsp;&nbsp;_parent.Light_11.getPass_NS();<br />&nbsp;&nbsp;_parent.Light_13.getPass_NS();<br />&nbsp;&nbsp;_parent.Light_22.getPass_NS();<br />&nbsp;&nbsp;_parent.Light_31.getPass_NS();<br />&nbsp;&nbsp;_parent.Light_33.getPass_NS();<br />}<br /><br /><br />6,所创建的滑杆组件的代码<br /><br />on (press) {<br />&nbsp;&nbsp;onEnterFrame = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;this._x = _parent._xmouse;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (this._x&lt;0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._x = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;} else if (this._x&gt;100) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._x = 100;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;_parent.mark._x = this._x-112.0;<br />&nbsp;&nbsp;};<br />}<br />on (release, releaseOutside) {<br />&nbsp;&nbsp;delete onEnterFrame;<br />&nbsp;&nbsp;_parent.mark._x = this._x-112.0;<br />&nbsp;&nbsp;if (this._x&lt;0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;this._x = 0;<br />&nbsp;&nbsp;} else if (this._x&gt;100) {<br />&nbsp;&nbsp;&nbsp;&nbsp;this._x = 100;<br />&nbsp;&nbsp;}<br />}<br /><br />onClipEvent (load) {<br />&nbsp;&nbsp;// *** 设定从哪个数值到哪个数值 ***<br />&nbsp;&nbsp;from = 400;<br />&nbsp;&nbsp;to = 5;<br />&nbsp;&nbsp;// *** 初始值(0到100) ***<br />&nbsp;&nbsp;default_value = 85;<br />&nbsp;&nbsp;//<br />&nbsp;&nbsp;//<br />&nbsp;&nbsp;line._x = default_value;<br />&nbsp;&nbsp;mark._x = line._x-112.0;<br />}<br />onClipEvent (enterFrame) {<br />&nbsp;&nbsp;// *** 要控制的变量 ***<br />&nbsp;&nbsp;_root.lightChangeSpeed = from+((to-from)*line._x/100);<br />}<br />
</blockquote>
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=93]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=93]]></guid>
    <dc:subject><![CDATA[Flash及其它]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-03-09T00:47:27Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[Java DES SHA] JSecureKit]]></title>
    <description><![CDATA[可对单个文件或整个文件夹进行加密或解密，使用DES算法
可计算单个文件或整个文件夹的消息摘要，使用SHA算法
 
 
 attachments/jSecureKit/0.gif 

 
 
 
 点击运行该程序(jar) 

 若不能正常运行请先安装 Java运行环境(JRE) 


可执行文件、文档、源代码...]]></description>
    <content:encoded><![CDATA[可对单个文件或整个文件夹进行加密或解密，使用DES算法<br />可计算单个文件或整个文件夹的消息摘要，使用SHA算法<br />        <br />        <br /><div style="text-align:center"><a href="attachments/jSecureKit/0.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jSecureKit/0.gif</a></div><br /><br />        <br />                <br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与下载:</div>
<div><br /><a target="_blank" href="attachments/jsecurekit/JSecureKit.jar">点击运行该程序(jar)</a>     <br /><br /><a target="_blank" href="http://www.java.com">若不能正常运行请先安装 Java运行环境(JRE)</a> <br /><br /><br />可执行文件、文档、源代码下载：<br /><a href="attachments/jsecurekit/jsecurekit.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>        <br />        <br />        <br />        <br /><br /><font size="2"><strong>功能：</strong></font><br /><br />加密解密部分：<br />DES算法<br /><br />1.&nbsp;&nbsp;可对单个文件进行加/解密操作<br />2.&nbsp;&nbsp;可对整个目录（包括子目录）下所有文件进行加/解密操作，输出结果为一个与源目录文件结构完全相同的新建目录（子目录，文件名都相同，只是文件内容为加/解密后结果）<br />3.&nbsp;&nbsp;要求输入的密钥为7个字符（56-bit），程序内自动加校验码增加到64-bit做为DES密钥<br />4.&nbsp;&nbsp;可显示加/解密处理总时间<br /><br />计算消息摘要（散列值）部分：<br />SHA算法<br /><br />1，&nbsp;&nbsp;可计算单个文件的消息摘要<br />2，&nbsp;&nbsp;可计算整个目录（包括子目录）下所有文件的消息摘要<br />3，&nbsp;&nbsp;计算结果（160-bit）以十六进制字符串方式显示在界面上，计算结束后会提示是否把结果保存到文件上（二进制）<br />4，&nbsp;&nbsp;计算整个目录（甚至整个硬盘）消息摘要的作用：可用于检测指定目录或磁盘下某一文件某一字节是否被修改过，是否有增加或删除过文件或目录，某一文件/目录是否被重命名过<br />5，&nbsp;&nbsp;可显示计算总时间<br /><br />        <br />        <br />        <br /><font size="2"><strong>使用说明：</strong></font><br /><br />输入框：<br />Source File/Dir：&nbsp;&nbsp;&nbsp;&nbsp;点击选择要进行 加/解密操作 或消息摘要计算 的源文件或源目录<br />Save To：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击选择保存 加/解密操作结果 的文件或目录<br />Key：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入加/解密的密钥，至少为7字符（少则有出错提示，多则只取前7个）<br />Digest(Hex)：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以十六进制字符串方式显示Hash计算结果（64-bit）<br /><br />按钮：<br />Encrypt：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单击进行加密操作<br />Decrypt：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单击进行解密操作<br />Get Digest：&nbsp;&nbsp;单击计算消息摘要<br />        <br />        <br />        <br /><div style="text-align:center"><a href="attachments/jSecureKit/1.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jSecureKit/1.gif</a></div><br />        <br />        <br />        <br /><br /><div style="text-align:center"><a href="attachments/jSecureKit/2.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/jSecureKit/2.gif</a></div><br />        <br />        <br />        <br />        <br />        <br />        <br /><font size="2"><strong>主要类功能说明</strong></font><br /><br />本软件中主要类都在包hartech.kids.jSecureKit内（目录hartech/kids/jSecureKit）<br />源程序中其它包的类为本软件要用到的，因为其它软件也共用这些类，所以没放在jSecureKit包内<br /><br />类<u>hartech.kids.jSecureKit.Main</u><br />本类里包含了加/解密函数，计算消息摘要（散列值）等，在各个按钮事件处理中被调用<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;该类主要接口：<br />&nbsp;&nbsp;&nbsp;&nbsp;public static String getHexString(byte[] bytes)<br />&nbsp;&nbsp;&nbsp;&nbsp;把散列计算结果生成的字节数组转换为十六进制字符串，用于显示在界面上<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static byte[] getMessageDigest(File file)<br />&nbsp;&nbsp;&nbsp;&nbsp;计算指定文件的散列值<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static boolean enDeCrypt(String keyStr, File fin, File fout,<br />                     &nbsp;&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   boolean isEncrypt)<br />&nbsp;&nbsp;&nbsp;&nbsp;根据输入密钥字符串（56-bit），源文件，目标文件 进行加密或解密操作<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static byte[] addParity(byte[] in)<br />&nbsp;&nbsp;&nbsp;&nbsp;把7字节（56-bit）密钥加入校验值转换为64-bit密钥，被调用于enDeCrypt内<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />类<u>hartech.kids.jDesKit.Actions</u><br />处理Encrypt，Decrypt，Get Digest按钮所激发的事件<br />包含各种输入错误提示框，处理结果提示框，文件选择框<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />类<u>hartech.kids.jDesKit.UI</u><br />处理本软件界面<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />其它包中两个主要类简介（具体使用说明见源程序中注释，其它类说明见其源程序中注释）：<br /><br />类<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=78">hartech. JDirectory</a><br />实现遍历指定文件夹下所有文件，包括所有子目录，可加过滤器<br />使用nextFile()每次返回其中一个文件<br />应用于对整个目录进行Hash计算中读取各个文件<br /><br />类<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=78">hartech.JDirectorySaveAs</a><br />继承自<a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=78">hartech. JDirectory</a>类<br />每次返回一个FileBag对象，里面包含一个源文件和一个根据目标目录构造好路径的目标文件<br />用于对整个目录进行 加/解密操作 中读取源文件并把结果保存到相应目标文件中<br /><br />        <br />        <br />        <br />        <br />        <br />        <br /><font size="2"><strong>简单测试：</strong></font><br /><br /><blockquote class="ubbCode">
1，测试消息摘要（散列值）部分：<br /><br />计算整个目录的消息摘要：<br />以一个具有87个文件，17个文件夹，总大小为400KB的目录SCR为例<br /><br />一开始整个目录的消息摘要为：<br />41 e9 00 77 a9 26 41 ab 4f 3c b4 5c 1e 49 08 79 08 b2 b3 bd<br /><br />对目录内一个文本文件加一个空格后，该目录的消息摘要为：<br />9f 23 28 7e 10 19 59 50 9e 8b 22 c8 47 1b bc 8b 2b 95 02 c1<br /><br />删除其中一文件后，该目录的消息摘要为：<br />a8 ec 74 8c 85 04 68 a5 93 2b 4b 26 64 ed 6e ff e8 b3 45 df<br /><br />增加一文件后，该目录的消息摘要为：<br />f7 5b 61 40 a8 d6 c5 1b 09 98 7f cc 84 2b a5 05 d7 ef 33 67<br /><br /><br />2，测试加/解密整个目录部分：<br /><br />测试方法:<br />先对源目录计算其消息摘要，再对该目录进行加密，然后对生成的目录进行解密，计算解密后目录的消息摘要，若两消息摘要相同，则说明源目录与加密解密后的目录内容完全相同<br /><br />以一个具有87个文件，17个文件夹，总大小为400KB的目录SCR为例<br /><br />SCR目录的消息摘要为：<br />41 e9 00 77 a9 26 41 ab 4f 3c b4 5c 1e 49 08 79 08 b2 b3 bd<br /><br />对其加密，密钥1234567，结果另存为SCR_encrypt目录<br />再对SCR_encrypt进行解密，结果另存为SCR_decrypt目录<br /><br />再计算SCR_decrypt目录的消息摘要：<br />41 e9 00 77 a9 26 41 ab 4f 3c b4 5c 1e 49 08 79 08 b2 b3 bd<br /><br />该的消息摘要与源目录SCR的消息摘要相同，说明源目录与加密解密后的目录内容完全相同
</blockquote><br /><br /><br />
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=92]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=92]]></guid>
    <dc:subject><![CDATA[J2SE]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2007-01-18T19:52:33Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[数据结构 Java] AVL tree 平衡二叉树]]></title>
    <description><![CDATA[AVLtree类接口： 
使用方法见注释
 interface AVLtree_Interface {

		// return the number of nodes in the tree
		public int getSize();

		// ins&#101;rt element
		// the element's key and its reference
		// if the key already existed,return fal...]]></description>
    <content:encoded><![CDATA[<strong>AVLtree类接口：</strong><br />使用方法见注释<br /><blockquote class="ubbCode">
interface AVLtree_Interface {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// return the number of nodes in the tree<br />&nbsp;&nbsp;&nbsp;&nbsp;public int getSize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// insert element<br />&nbsp;&nbsp;&nbsp;&nbsp;// the element&#39;s key and its reference<br />&nbsp;&nbsp;&nbsp;&nbsp;// if the key already existed,return false<br />&nbsp;&nbsp;&nbsp;&nbsp;public boolean insert(int key, Object reference);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// whether the tree is empty<br />&nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// print the this AVL binary tree<br />&nbsp;&nbsp;&nbsp;&nbsp;// using preorder traversal to print all the nodes and its left/right childs<br />&nbsp;&nbsp;&nbsp;&nbsp;// print out format:<br />&nbsp;&nbsp;&nbsp;&nbsp;//  Node [node&#39;s key]:  Left child:[lchlid&#39;s key]  Right child:[rchild&#39;s key]<br />&nbsp;&nbsp;&nbsp;&nbsp;public void printTree();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// search by key, return its reference<br />&nbsp;&nbsp;&nbsp;&nbsp;// if not find,return null<br />&nbsp;&nbsp;&nbsp;&nbsp;public Object search(int key);<br />}
</blockquote><br /><br /><br /><strong>AVLtree类：</strong><br /><blockquote class="ubbCode">
package hartech.ds;<br /><br />/**<br />&nbsp;&nbsp;* &lt;p&gt;Title: AVL tree &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Description:<br />&nbsp;&nbsp;* Balanced Binary Tree<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* according to the DS book&#39;s algorithm P236<br />&nbsp;&nbsp;*  but it&#39;s written in C++ which has reference variable which java don&#39;t have<br />&nbsp;&nbsp;*  so transform some codes of it<br />&nbsp;&nbsp;*     see the NoteBook Java(2) about how to transform<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Website: www.hartech.cn &lt;/p&gt;<br />&nbsp;&nbsp;* &lt;p&gt;Page: <a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=91">http://www.hartech.cn/blog/blogview.asp?logID=91</a> &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Date: 2006-12-06 &lt;/p&gt;<br />&nbsp;&nbsp;*/<br /><br />public class AVLtree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;implements AVLtree_Interface {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// AVL tree node<br />&nbsp;&nbsp;&nbsp;&nbsp;class Node {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the node&#39;s key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int key;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// content binding to the key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object reference;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the node&#39;s balance factor(平衡因子)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int bf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node(int key, Object reference) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.key = key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.reference = reference;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// root node<br />&nbsp;&nbsp;&nbsp;&nbsp;// if tree is empty, root==null<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node root;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// the number of nodes in the tree<br />&nbsp;&nbsp;&nbsp;&nbsp;private int size;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// whether the tree getter taller after insert<br />&nbsp;&nbsp;&nbsp;&nbsp;private boolean taller;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// whether insert successfully,if the key already existed,return false<br />&nbsp;&nbsp;&nbsp;&nbsp;private boolean insert_return;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// balance factor&#39;s value<br />&nbsp;&nbsp;&nbsp;&nbsp;private final int LH = +1; // left taller<br />&nbsp;&nbsp;&nbsp;&nbsp;private final int EH = 0; // balanced<br />&nbsp;&nbsp;&nbsp;&nbsp;private final int RH = -1; // right taller<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// initializtion<br />&nbsp;&nbsp;&nbsp;&nbsp;public AVLtree() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_return = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return root == null;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public int getSize() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return size;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// print the binary tree<br />&nbsp;&nbsp;&nbsp;&nbsp;// using preorder traversal to print all the nodes and its left/right childs<br />&nbsp;&nbsp;&nbsp;&nbsp;//       print format:<br />&nbsp;&nbsp;&nbsp;&nbsp;//       [node&#39;s key]:  Left child: [lchlid&#39;s key] Right child [rchild&#39;s key]<br />&nbsp;&nbsp;&nbsp;&nbsp;public void printTree() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isEmpty()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;This AVL tree is Empty!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Number of nodes:  &quot; + getSize());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printTree(root);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;private void printTree(Node node) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (node == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(&quot;Node [&quot; + node.key + &quot;]&quot; + &quot;:\t\tLeft child:  &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (node.lchild != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(node.lchild.key + &quot;\t\tRight child:  &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(&quot;null\tRight child:  &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (node.rchild != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(node.rchild.key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(&quot;null&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printTree(node.lchild);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printTree(node.rchild);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// search by key, return its reference<br />&nbsp;&nbsp;&nbsp;&nbsp;public Object search(int key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return search(root, key);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;private Object search(Node node, int key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// can&#39;t find it<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (node == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Can&#39;t find key:&quot; + key + &quot; in the tree!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key == node.key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node.reference;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key &lt; node.key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return search(node.lchild, key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return search(node.rchild, key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// insert element<br />&nbsp;&nbsp;&nbsp;&nbsp;// the element&#39;s key and its reference<br />&nbsp;&nbsp;&nbsp;&nbsp;// if the key already existed,return false<br />&nbsp;&nbsp;&nbsp;&nbsp;public boolean insert(int key, Object reference) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root = insert(root, key, reference);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return insert_return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// called in insert()<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node insert(Node node, int key, Object reference) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// insert new node<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (node == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = new Node(key, reference);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_return = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// key already existed,don&#39;t do anything<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key == node.key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_return = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the key smaller than the node&#39;s key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key &lt; node.key) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// insert into node&#39;s left tree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.lchild = insert(node.lchild, key, reference);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// left tree has taller, adjust it<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (taller) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (node.bf) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = leftBalance(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case EH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = LH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the key bigger than the node&#39;s key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// insert into node&#39;s right tree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.rchild = insert(node.rchild, key, reference);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// right tree has taller,adjust it<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (taller) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (node.bf) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case EH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = RH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = rightBalance(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taller = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_return = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// left balance<br />&nbsp;&nbsp;&nbsp;&nbsp;// called in insert(Node,int,Object)<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node leftBalance(Node node) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node lc = node.lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (lc.bf) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// right single rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = right_rotate(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// left-right double rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node rd = lc.rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (rd.bf) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = RH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case EH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lc.bf = LH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.lchild = left_rotate(node.lchild);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = right_rotate(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// right balance<br />&nbsp;&nbsp;&nbsp;&nbsp;// called in insert(Node,int,Object)<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node rightBalance(Node node) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node rc = node.rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (rc.bf) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// left single rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = left_rotate(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// right-left double rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node ld = rc.lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (ld.bf) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case RH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = LH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case EH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case LH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc.bf = RH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ld.bf = EH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.rchild = right_rotate(node.rchild);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = left_rotate(node);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// single right rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node right_rotate(Node node) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node lc = node.lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.lchild = lc.rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lc.rchild = node;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = lc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// single left rotate<br />&nbsp;&nbsp;&nbsp;&nbsp;private Node left_rotate(Node node) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node rc = node.rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.rchild = rc.lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc.lchild = node;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = rc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return node;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
</blockquote><br /><br /><br /><strong>测试：</strong><br /><blockquote class="ubbCode">
&nbsp;&nbsp;&nbsp;&nbsp;// test<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String args[]) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVLtree avl = new AVLtree();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(4, &quot;NO.4 info Jack&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(6, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(8, &quot;NO.8 info harTech&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(3, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(2, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(5, &quot;NO.5 info JTL&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(1, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(10, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(9, null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.insert(7, null);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avl.printTree();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// test search() method<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(avl.search(8));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(avl.search(88));<br />&nbsp;&nbsp;&nbsp;&nbsp;}
</blockquote><br /><br /><br /><strong>输出：</strong><br /><blockquote class="ubbCode">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Number of nodes:  10<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [4]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  2&nbsp;&nbsp;&nbsp;&nbsp;Right child:  8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [2]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  1&nbsp;&nbsp;&nbsp;&nbsp;Right child:  3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [1]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [3]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [8]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  6&nbsp;&nbsp;&nbsp;&nbsp;Right child:  9<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [6]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  5&nbsp;&nbsp;&nbsp;&nbsp;Right child:  7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [5]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [7]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [9]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  10<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node [10]:&nbsp;&nbsp;&nbsp;&nbsp;Left child:  null&nbsp;&nbsp;Right child:  null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NO.8 info harTech<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Can&#39;t find key:88 in the tree!
</blockquote><br /><br /><br /><strong>输出的树的图：</strong><br /><br /><a href="attachments/m&#111;nth_200612/09_085532_jg9nAVL.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/m&#111;nth_200612/09_085532_jg9nAVL.gif</a>
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=91]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=91]]></guid>
    <dc:subject><![CDATA[数据结构 Java]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2006-12-09T08:43:56Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[数据结构 Java] 图的算法演示]]></title>
    <description><![CDATA[演示了四种图的算法：深度优先遍历、广度优先遍历、最小生成树、图的最短路径
界面上的节点可以任意拖动，节点间距离为两点间实测直线距离，单位为象素
 
 
 attachments/grapher/ooop.gif 
			
			
			
			
 
 进入演示页面(applet) 

 点击运行该程序(jar...]]></description>
    <content:encoded><![CDATA[演示了四种图的算法：深度优先遍历、广度优先遍历、最小生成树、图的最短路径<br />界面上的节点可以任意拖动，节点间距离为两点间实测直线距离，单位为象素<br />    <br />     <br /><div style="text-align:center"><a href="attachments/grapher/ooop.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/ooop.gif</a></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与下载:</div>
<div><br /><a target="_blank" href="attachments/grapher/">进入演示页面(&#097;pplet)</a>   <br /><br /><a target="_blank" href="attachments/grapher/Grapher.jar">点击运行该程序(jar)</a>     <br /><br /><a target="_blank" href="http://www.java.com">若不能正常运行请先安装 Java运行环境(JRE)</a> <br /><br /><br />可执行文件、文档、源代码下载：<br /><a href="attachments/grapher/grapher.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />图的结构有两种可选：<br /><br />一，完全无向图：任意两个节点间都有一无向路径，距离为两节点间实际距离<br />二，无向图：任意一节点仅和其相邻的最近两个节点有连通，该路径用灰色虚线表示（下图）<br />（点击&quot;设置&quot;－&quot;使用路线图&quot;来切换以上两种模式）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><a href="attachments/grapher/route.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/route.gif</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><strong>深度优先遍历：</strong><br /><br />蓝色<br />采用递归的方法，使用邻接矩阵<br />在列出第n节点相邻的节点并一一入栈时，相邻最近的优先入栈<br />可以看出深度优先遍历的顺序是一直深入探索下去<br />可选起点，可选显示序号，右下角为其总路程长度<br /><br /><br /><a href="attachments/grapher/dfs.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/dfs.gif</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><strong>广度优先遍历：</strong><br /><br />绿色<br />使用辅助队列、邻接矩阵<br />在列出第n节点相邻的节点并一一入队时，相邻最近的优先入队<br />可以看出广度优先遍历的顺序是按距离一层层探索出去<br />可选起点，可选显示序号，右下角为其总路程长度<br /><br /><br /><a href="attachments/grapher/bfs.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/bfs.gif</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><strong>最小生成树：</strong><br /><br />红色<br />最小生成树：使用线把所有节点连接起来，且要求线段的总长度最短<br />采用克鲁斯卡尔（Kruskal）算法，邻接矩阵<br />使用一辅助数组记录节点的连通情况（记录连通图组，具体见源码中注释）<br />可选显示序号，右下角为其总路程长度<br /><br /><br /><a href="attachments/grapher/tree.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/tree.gif</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><strong>图的最短路径：</strong><br /><br />紫色<br />采用迪杰斯特拉（Dijkstra）算法，邻接矩阵<br />使用队列记录依次途经的路径<br />在这里要打开&quot;使用路线图&quot;，因若不打开，则为完全图，两点间直线距离最短，没意思<br />可选起点、终点，可选显示序号，右下角为其总路程长度<br /><br /><br /><a href="attachments/grapher/shortest.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/grapher/shortest.gif</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />相关：<br />C++的图的最短路径应用  <br /><a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=52">http://www.hartech.cn/blog/blogview.asp?logID=52</a><br />最短路径理解  <br /><a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=54">http://www.hartech.cn/blog/blogview.asp?logID=54</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />主要类：Graph.java<br /><br /><blockquote class="ubbCode">
package hartech.kids.grapher;<br /><br />import hartech.ds.Queue;<br />import java.awt.Dimension;<br /><br />/**<br />&nbsp;&nbsp;* &lt;p&gt;Title: 图的遍历、最小生成树、最短路径&lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Description:<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 采用邻接矩阵做为图存储结构，有权无向图，不相连的值为 -1<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 图的遍历中深度遍历采用递归方法，广度遍历使用辅助队列<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 最小生成树采用克鲁斯卡尔（Kruskal）算法，使用一数组记录节点的连通情况<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 图的最短路径采用迪杰斯特拉（Dijkstra）算法，使用队列记录依次途经的路径<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* 修改：<br />&nbsp;&nbsp;* 深度、广度遍历中 在列出第n节点相邻的节点并一一入栈/队时，相邻最近的优先入栈/队<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Website: www.hartech.cn &lt;/p&gt;<br />&nbsp;&nbsp;* &lt;p&gt;Page: <a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=88">http://www.hartech.cn/blog/blogview.asp?logID=88</a> &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Date: 2006-09-08 &lt;/p&gt;<br />&nbsp;&nbsp;*/<br />public class Graph {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 图邻接矩阵<br />&nbsp;&nbsp;&nbsp;&nbsp;private static int[][] arcs;<br />&nbsp;&nbsp;&nbsp;&nbsp;// 节点数<br />&nbsp;&nbsp;&nbsp;&nbsp;private static int num;<br />&nbsp;&nbsp;&nbsp;&nbsp;// 记录是否访问过<br />&nbsp;&nbsp;&nbsp;&nbsp;private static boolean[] hasVisit;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 记录访问过的前一个节点，用于统计线路总长度<br />&nbsp;&nbsp;&nbsp;&nbsp;static int pre;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 深度优先遍历，给出图邻接矩阵和开始遍历的节点<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void traverse_DFS(int[][] arcs_in, int begin) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre = begin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (arcs_in == null || arcs_in.length == 0 ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs_in.length != arcs_in[0].length || begin &lt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;wrong arcs[][] or begin!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs = arcs_in;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = arcs.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasVisit = new boolean[num];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS(begin);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;private static void DFS(int begin) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasVisit[begin] = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.Q_DFS.enQueue(begin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.length_DFS += Main.arcs[pre][begin];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre = begin;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int min, n = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 距离最短的优先入栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = Integer.MAX_VALUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; num; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!hasVisit[j] &amp;&amp; arcs[begin][j] != -1 &amp;&amp; arcs[begin][j] &lt; min) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = arcs[begin][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (min == Integer.MAX_VALUE) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS(n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 广度优先遍历，给出图邻接矩阵和开始遍历的节点<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void traverse_BFS(int[][] arcs_in, int begin) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre = begin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (arcs_in == null || arcs_in.length == 0 ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs_in.length != arcs_in[0].length || begin &lt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;wrong arcs[][] or begin!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs = arcs_in;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = arcs.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasVisit = new boolean[num];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue queue = new Queue();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasVisit[begin] = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.enQueue(begin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int temp, min, n = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (!queue.isEmpty()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = ( (Integer) queue.deQueue()).intValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 距离最短的优先入队<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = Integer.MAX_VALUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; num; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!hasVisit[j] &amp;&amp; arcs[temp][j] != -1 &amp;&amp; arcs[temp][j] &lt; min) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = arcs[temp][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (min == Integer.MAX_VALUE) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasVisit[n] = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.enQueue(n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.Q_BFS.enQueue(n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.length_BFS += Main.arcs[pre][n];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre = n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 构造最小生成树，采用克鲁斯卡尔（Kruskal）算法<br />&nbsp;&nbsp;&nbsp;&nbsp;// 使用一数组记录节点的连通情况<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void miniSpanTree(int[][] arcs_in) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (arcs_in == null || arcs_in.length == 0 ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs_in.length != arcs_in[0].length) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;wrong arcs[][]!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs = arcs_in;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = arcs.length;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 使用一数组记录节点的连通情况<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 如 group[0]＝0 表示节点未和任何节点连通<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// group[0]=group[3]=group[5]=2 表示节点0、3、5为同一连通图内，该连通图的标识为 2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] group = new int[num];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean finish = false;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int temp = 0, min, n1 = 0, n2 = 0, groupNum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 到全部group[n]等于同一数值，也就是处于同一连通图才结束<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (!finish) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 遍历所有路径，无向图，仅遍历矩阵上三角<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 找出最短的且不在同一连通图的（group[n1]!=group[n2]），或两节点都未加入连通图的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = Integer.MAX_VALUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = i + 1; j &lt; num; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (arcs[i][j] &lt; min &amp;&amp; arcs[i][j] != -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (group[i] != group[j] || (group[i] == 0 &amp;&amp; group[j] == 0)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = arcs[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n1 = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n2 = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 无路了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (min == Integer.MAX_VALUE) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.Q_tree.enQueue(new Dimension(n1, n2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.length_tree += Main.arcs[n1][n2];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加入连通图组<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (group[n1] == 0 &amp;&amp; group[n2] == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupNum++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group[n1] = groupNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group[n2] = groupNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (group[n1] != 0 &amp;&amp; group[n2] != 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = group[n2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (group[i] == temp) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group[i] = group[n1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (group[n1] == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group[n1] = group[n2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group[n2] = group[n1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 到全部group[n]等于同一数值且不为0，也就是处于同一连通图才结束<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (temp &lt; num &amp;&amp; group[temp] == group[0]) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (group[0] != 0 &amp;&amp; temp == num) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!finish) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;图为非强连通图&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 图的最短路径，给出图邻接矩阵，起点，终点，打印出途经的节点<br />&nbsp;&nbsp;&nbsp;&nbsp;// 采用迪杰斯特拉（Dijkstra）算法<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void shortestPath_DIJ(int[][] arcs_in, int begin, int end) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (arcs_in == null || arcs_in.length == 0 ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs_in.length != arcs_in[0].length) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;wrong arcs[][]!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arcs = arcs_in;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = arcs.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 标识节点是否已找到最短路径，从begin到n 为finish[n]=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean[] finish = new boolean[num];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 记录从 begin 到 n 的最短路径为 min[n]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] D = new int[num];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 使用队列记录路径途经节点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue[] queue = new Queue[num];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D[i] = arcs[begin][i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish[i] = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue[i] = new Queue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish[begin] = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D[begin] = -1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int v = 0, min = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一个一个循环找出最短距离（共num－1个）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; num; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = Integer.MAX_VALUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 扫描找出非final集中最小的D[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int w = 0; w &lt; num; w++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!finish[w] &amp;&amp; D[w] &lt; min &amp;&amp; D[w] != -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v = w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min = D[w];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish[v] = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 已找到目标，退出循环<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (v == end) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue[v].enQueue(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.Q_shortest = queue[v].clone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.length_short = D[v];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 更新各D[]数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int w = 0; w &lt; num; w++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!finish[w] &amp;&amp; arcs[v][w] != -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( (arcs[v][w] + min) &lt; D[w] || D[w] == -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D[w] = arcs[v][w] + min;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue[w] = queue[v].clone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue[w].enQueue(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue[v].enQueue(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
</blockquote>
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=88]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=88]]></guid>
    <dc:subject><![CDATA[数据结构 Java]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2006-09-24T11:49:26Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[数据结构 Java] 哈夫曼编码/译码器]]></title>
    <description><![CDATA[
 attachments/huffman/1.gif 
 
 
 
在上面的输入框输入要编码的正文，按“编码”按钮获得对应哈夫曼编码
也可在下面的输入框输入哈夫曼编码，按“译码”获取原文
 
 
 
 进入演示页面(applet) 

 点击运行该程序(jar) 

 若不能正常运行请先安装 Java运...]]></description>
    <content:encoded><![CDATA[<br /><div style="text-align:center"><a href="attachments/huffman/1.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/huffman/1.gif</a></div><br />    <br />     <br />      <br />在上面的输入框输入要编码的正文，按&quot;编码&quot;按钮获得对应哈夫曼编码<br />也可在下面的输入框输入哈夫曼编码，按&quot;译码&quot;获取原文<br />    <br />     <br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与下载:</div>
<div><br /><a target="_blank" href="attachments/huffman/">进入演示页面(&#097;pplet)</a>   <br /><br /><a target="_blank" href="attachments/huffman/Huffman.jar">点击运行该程序(jar)</a>     <br /><br /><a target="_blank" href="http://www.java.com">若不能正常运行请先安装 Java运行环境(JRE)</a> <br /><br /><br />可执行文件、文档、源代码下载：<br /><a href="attachments/huffman/huffman.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>     <br />      <br /><br />下面依次为&quot;显示哈夫曼树&quot;、&quot;显示编码表&quot;、&quot;显示字母频率&quot;三个按钮的弹出窗口：<br />    <br />     <br /><div style="text-align:center"><br /><a href="attachments/huffman/2.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/huffman/2.gif</a><br />    <br />     <br /><br /><a href="attachments/huffman/3.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/huffman/3.gif</a><br />    <br />     <br /><br /><a href="attachments/huffman/4.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/huffman/4.gif</a></div><br />    <br />     <br />    <br />     <br /><br /><strong>主要类：Huffman.java</strong><br /><blockquote class="ubbCode">
package hartech.kids.huffman;<br /><br />/**<br />&nbsp;&nbsp;* &lt;p&gt;Title: 哈夫曼编/译码器&lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Description:<br />&nbsp;&nbsp;* 利用哈夫曼编码进行信息通信可以大大提高信道利用率，缩短信息传输时间，降低传输成本。<br />&nbsp;&nbsp;* 但是，这要求在发送端通过一个编码系统对待传数据预先编码，<br />&nbsp;&nbsp;* 在接收端将传来的数据进行译码（复原）。对于双工信道（即可以双向传输信息的信道），<br />&nbsp;&nbsp;* 每端都需要一个完整的编／译码系统。试为这样的信息收发站写一个哈夫曼码的编／译码系统。<br />&nbsp;&nbsp;* &lt;/p&gt;<br />&nbsp;&nbsp;*<br />&nbsp;&nbsp;* &lt;p&gt;Website: www.hartech.cn &lt;/p&gt;<br />&nbsp;&nbsp;* &lt;p&gt;Page: <a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=87">http://www.hartech.cn/blog/blogview.asp?logID=87</a> &lt;/p&gt;<br />&nbsp;&nbsp;* &lt;p&gt;Date: 2006-09-05 &lt;/p&gt;<br />&nbsp;&nbsp;*/<br />public class Huffman {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;class Elem {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char chara;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int weight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int parent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Elem(char c, int w, int p, int l, int r) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chara = c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weight = w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent = p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lchild = l;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rchild = r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 哈夫曼树<br />&nbsp;&nbsp;&nbsp;&nbsp;private Elem[] huffmanTree;<br />&nbsp;&nbsp;&nbsp;&nbsp;// 哈夫曼编码表<br />&nbsp;&nbsp;&nbsp;&nbsp;private String[] huffmanCode;<br />&nbsp;&nbsp;&nbsp;&nbsp;// 字符个数<br />&nbsp;&nbsp;&nbsp;&nbsp;int charNum;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 给出 in 构造哈夫曼树 huffmanTree、哈夫曼编码表huffmanCode<br />&nbsp;&nbsp;&nbsp;&nbsp;// in 格式为{&#39;字符1&#39;,对应权值,&#39;字符2&#39;,对应权值,  ...}<br />&nbsp;&nbsp;&nbsp;&nbsp;public Huffman(char[] in) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (in == null || in.length == 0 || in.length % 2 != 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;dd&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charNum = in.length / 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 0 单元不用，要用到 0 来标记是否有孩子、父亲<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree = new Elem[charNum * 2];<br />// 初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; charNum + 1; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i] = new Elem(in[ (i - 1) * 2], in[i * 2 - 1], 0, 0, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = charNum + 1; i &lt; charNum * 2; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i] = new Elem( (char) 0, 0, 0, 0, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />// 构造哈夫曼树<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[0] = new Elem( (char) 0, Integer.MAX_VALUE, 0, 0, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int minNo1, minNo2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = charNum + 1; i &lt; charNum * 2; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 找出weight最小且无父节点的两个<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minNo1 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minNo2 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 1; j &lt; i; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (huffmanTree[j].parent == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (huffmanTree[j].weight &lt; huffmanTree[minNo1].weight ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[j].weight &lt; huffmanTree[minNo2].weight) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (huffmanTree[minNo1].weight &lt; huffmanTree[minNo2].weight) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minNo2 = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minNo1 = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[minNo1].parent = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[minNo2].parent = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 保持叶子节点为父节点的左孩，如书上图6.26<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (minNo1 &lt;= charNum) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].lchild = minNo1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].rchild = minNo2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].lchild = minNo2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].rchild = minNo1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].weight = huffmanTree[minNo1].weight +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[minNo2].weight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />// 求出每个字符编码，从叶子到根，保存至 huffmanCode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanCode = new String[charNum + 1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char[] temp = new char[charNum + 1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int start, pa, ch;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= charNum; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start = charNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa = huffmanTree[i].parent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (pa != 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (huffmanTree[pa].lchild == ch) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[start] = &#39;0&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[start] = &#39;1&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = pa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa = huffmanTree[pa].parent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanCode[i] = String.valueOf(temp, start + 1, charNum - start);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 返回给定字符串的哈夫曼代码，对于本树中无记录的字符则直接插入到原对应位置<br />&nbsp;&nbsp;&nbsp;&nbsp;String toCodes(String in) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer out = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; in.length(); i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = in.charAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (huffmanTree[j].chara != c &amp;&amp; j &lt;= charNum) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (j &lt;= charNum) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(huffmanCode[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return out.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 对给定哈夫曼码译码，对于非 1、0 的字符直接插入到原对应位置<br />&nbsp;&nbsp;&nbsp;&nbsp;String toChars(String in) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer out = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 指向树根<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int point = charNum * 2 - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; in.length(); i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = in.charAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == &#39;0&#39;) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = huffmanTree[point].lchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (c == &#39;1&#39;) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = huffmanTree[point].rchild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 为叶子<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (point &lt;= charNum) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(huffmanTree[point].chara);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = charNum * 2 - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return out.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 打印哈夫曼树<br />&nbsp;&nbsp;&nbsp;&nbsp;public String printTree() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer out = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(&quot;No.\t&quot; + &quot;Char\t&quot; + &quot;Weight\t&quot; + &quot;Parent\t&quot; + &quot;Lchild\t&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Rchild&quot; + &quot;\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; charNum * 2; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(&quot;[&quot; + i + &quot;]\t&quot; + huffmanTree[i].chara + &quot;\t&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].weight + &quot;\t&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].parent + &quot;\t&quot; + huffmanTree[i].lchild + &quot;\t&quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffmanTree[i].rchild + &quot;\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return out.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;// 打印出所有编码<br />&nbsp;&nbsp;&nbsp;&nbsp;public String printCodes() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer out = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int value = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(&quot;No.\t&quot; + &quot;Char\t&quot; + &quot;Code&quot; + &quot;\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt; charNum + 1; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(&quot;[&quot; + i + &quot;]\t&quot; + huffmanTree[i].chara + &quot;\t&quot; + huffmanCode[i] +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value += huffmanCode[i].length() * huffmanTree[i].weight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.append(&quot;\r\n总带权路径长度为：\t&quot; + value + &quot;\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return out.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// test：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 词频表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char[] in = {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39; &#39;, 186, &#39;a&#39;, 64, &#39;b&#39;, 13, &#39;c&#39;, 22, &#39;d&#39;, 32, &#39;e&#39;, 103, &#39;f&#39;, 21, &#39;g&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15, &#39;h&#39;, 47, &#39;i&#39;, 57, &#39;j&#39;, 1, &#39;k&#39;, 5, &#39;l&#39;, 32, &#39;m&#39;, 20, &#39;n&#39;, 57, &#39;o&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63, &#39;p&#39;, 15, &#39;q&#39;, 1, &#39;r&#39;, 48, &#39;s&#39;, 51, &#39;t&#39;, 80, &#39;u&#39;, 23, &#39;v&#39;, 8, &#39;w&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18, &#39;x&#39;, 1, &#39;y&#39;, 16, &#39;z&#39;, 1};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Huffman huffman = new Huffman(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffman.printTree();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffman.printCodes();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 编码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 输出：0010111010101101000010101110001000101111100011000111000010101101<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//      000001110010100000001111011000110100100110010100010100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String code = huffman.toCodes(&quot;this program is my favorite&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 译码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 输出：this program is my favorite<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huffman.toChars(code);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
</blockquote><br />
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=87]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=87]]></guid>
    <dc:subject><![CDATA[数据结构 Java]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2006-09-08T23:07:45Z</dc:date>
  </item>

	<item>
    <title><![CDATA[[数据结构 Java] 文件统计器]]></title>
    <description><![CDATA[
可以统计 指定目录下（包括子目录）所有 指定类型文件 中出现的所有单词的频率并排序
同时统计以上所有文件的 文件数、目录数、总单词数、总行数、注释行数、代码行数
 
 attachments/filekits/FileKits.gif 
 
 
 
界面中：

Files 为所统计的总文件数，Dir...]]></description>
    <content:encoded><![CDATA[<br />可以统计 指定目录下（包括子目录）所有 指定类型文件 中出现的所有单词的频率并排序<br />同时统计以上所有文件的 文件数、目录数、总单词数、总行数、注释行数、代码行数<br />       <br /><div style="text-align:center"><a href="attachments/filekits/FileKits.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/filekits/FileKits.gif</a></div><br />       <br />       <br />        <br />界面中：<br /><br />Files 为所统计的总文件数，Directorys 为总目录数<br />Words 为所有文件中的单词数<br />Lines 为总行数、Comment Lines 为注释行数、Codes Lines 为程序行数<br /><br />接下的为 [单词出现频率]  -&gt;  该单词<br />频率高的在前面，同频率的单词在同一行<br />可见在这里 Java 中使用频率最高的为关键字 new，超过第二 jpanle 三分一以上，接下为 public、string<br />  <br />  <br />    <br />操作：<br /><br />第一个输入框 输入所要统计的目录或特定文件，也可点击右边 &quot;Pick&quot; 按钮使用对话框选择目录或文件<br />第二个输入框 输入所要统计文件类型的后缀，可多选，如 &quot;java,cpp,txt&quot;<br />界面右边为两条竖的按钮<br />左按钮点击开始统计<br />右按钮把所选定文件内容读取到剪贴板（仅是一附加功能，与上面的统计无关）<br />  <br />  <br />    <br />这里的单词界定为：纯字母连接组成，大小写视为同一单词<br />注释行：以 // 或 /* 或 * 或 &#39; 开头的行<br />程序行：总行数－注释行数<br /><br /><br /><blockquote class="ubbQuote">
<div class="ubbQuoteTitle">运行与下载:</div>
<div><br /><a target="_blank" href="attachments/filekits/FileKits.jar">点击运行该程序(jar)</a>    <br /><br />可执行程序与源代码下载：<br /><br /><a href="attachments/filekits/FileKits.rar"><img src="http://www.hartech.cn/blog/images/icon_save.gif" alt="save" /> <strong>File:</strong> Click to Download</a><br /><br /></div>
</blockquote>  <br />  <br />    <br />统计过程大致为：<br /><br />取出所有文件中的每个单词：<br /><br /><a target="_blank" href="http://www.hartech.cn/blog/blogview.asp?logID=78">JDirectory 类</a>实现遍历指定目录下所有文件（包括子目录），同时过滤文件（如只统计 java、cpp、txt 文件），每次返回其中一文件<br />JLineReader 类实现遍历上面所得的所有文件中的每一行，每次返回其中一行<br />再使用 pickWords() 方法读取出该行中各个单词（由纯字母组成，忽略大小写）<br /><br />统计单词频率：<br /><br />把取出的每个单词加入哈希表，该单词为 key、其出现频率为 值<br />同一单词每加一次其对应 值（频率）＋1<br />同时记录频率最高的频率值 maxFre<br /><br />对频率排序：<br /><br />全部加完后建一个字符串数组，数组中元素个数为 maxFre+1<br />把所有哈希表中的单词和其频率写入该字符串数组：<br />&nbsp;&nbsp;&nbsp;&nbsp;string[单词频率] + = &quot; -&gt; &quot; + 该单词字符串;<br />由此实现排序（如 string[maxFre]单词频率最高）<br />       <br />       <br />       <br />       <br />下面是分析网页文件（htm、html）的截图，分析对象是 JDK 5.0 Documentation<br /><br />a 为最多，它可能为网页中的链接符号，也可能是语言上的 a<br /><br />在网页代码中用得最多的是空格符 nbsp、粗体符号 b、code、html、href、td、font、tr<br />－－td 大概为 tr 的两倍，也就是说一般表格中平均行列比为 1：2<br />而关于 Java 的用到最多的为：class、java、javax、lang、swing、awt、object、interface、string、int、method<br />也可看出在语言上用得最多的为：the、of、to、is、this、and、that、by、an、or、with、be、from、as<br /><br />       <br />       <br /><a href="attachments/filekits/FileKits_2.gif" target="_blank"><img src="http://www.hartech.cn/blog/images/icon_image.gif" alt="image" /> <strong>Image:</strong> attachments/filekits/FileKits_2.gif</a><br />
		<br /><br /><link href="http://www.hartech.cn/blog/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=86]]></link>
		<guid isPermaLink="false"><![CDATA[http://www.hartech.cn/blog/blogview.asp?logID=86]]></guid>
    <dc:subject><![CDATA[数据结构 Java]]></dc:subject>
    <dc:creator><![CDATA[JTL]]></dc:creator>
    <dc:date>2006-09-04T12:15:14Z</dc:date>
  </item>

  </channel>
</rss>
