一个临时数组,其中包含了名为rs 的字串(rs 代表“结果集”——Result Set)。结果集要么直接从n 复 制(没有find 关键字),要么选择性地从包含了 find 关键字的n 中的字串复制。最后会检查strip Checkbox,看看用户是不是希望将名字中多余的部分删除(默认为“是”)。若答案是肯定的,则用 StripQualifiers。strip()做这件事情;反之,就将列表简单地显示出来。 在 init()中,大家也许认为在设置布局时需要进行大量繁重的工作。事实上,组件的布置完全可能只需要极 少的工作。但象这样使用BorderLayout 的好处是它允许用户改变窗口的大小,并特别能使 TextArea (文本 区域)更大一些,这意味着我们可以改变大小,以便毋需滚动即可看到更长的名字。 编程时,大家会发现特别有必要让这个工具处于运行状态,因为在试图判断要调用什么方法的时候,它提供 了最好的方法之一。 17。3 复杂性理论 下面要介绍的程序的前身是由Larry O"Brien 原创的一些代码,并以由 Craig Reynolds 于 1986 年编制的 “Boids”程序为基础,当时是为了演示复杂性理论的一个特殊问题,名为“凸显”(Emergence)。 这儿要达到的目标是通过为每种动物都规定少许简单的规则,从而逼真地再现动物的群聚行为。每个动物都 能看到看到整个环境以及环境中的其他动物,但它只与一系列附近的“群聚伙伴”打交道。动物的移动基于 三个简单的引导行为: (1) 分隔:避免本地群聚伙伴过于拥挤。 (2) 方向:遵从本地群聚伙伴的普遍方向。 (3) 聚合:朝本地群聚伙伴组的中心移动。 更复杂的模型甚至可以包括障碍物的因素,动物能预知和避免与障碍冲突的能力,所以它们能围绕环境中的 固定物体自由活动。除此以外,动物也可能有自己的特殊目标,这也许会造成群体按特定的路径前进。为简 化讨论,避免障碍以及目标搜寻的因素并未包括到这里建立的模型中。 尽管计算机本身比较简陋,而且采用的规则也相当简单,但结果看起来是真实的。也就是说,相当逼真的行 为从这个简单的模型中“凸显”出来了。 程序以合成到一起的应用程序/程序片的形式提供: //: FieldOBeasts。java // Demonstration of plexity theory; simulates // herding behavior in animals。 Adapted from // a program by Larry O"Brien lobrien@msn。 import java。awt。*; import java。awt。event。*; import java。applet。*; import java。util。*; class Beast { 643 …………………………………………………………Page 645…………………………………………………………… int x; y; // Screen position currentSpeed; // Pixels per second float currentDirection; // Radians Color color; // Fill color FieldOBeasts field; // Where the Beast roams static final int GSIZE = 10; // Graphic size public Beast(FieldOBeasts f; int x; int y; float cD; int cS; Color c) { field = f; this。x = x; this。y = y; currentDirection = cD; currentSpeed = cS; color = c; } public void step() { // You move based on those within your sight: Vector seen = field。beastListInSector(this); // If you"re not out in front if(seen。size() 》 0) { // Gather data on those you see int totalSpeed = 0; float totalBearing = 0。0f ; float distanceToNearest = 100000。0f; Beast nearestBeast = (Beast)seen。elementAt(0); Enumeration e = seen。elements(); while(e。hasMoreElements()) { Beast aBeast = (Beast) e。nextElement(); totalSpeed += aBeast。currentSpeed; float bearing = aBeast。bearingFromPointAlongAxis( x; y; currentDirection); totalBearing += bearing; float distanceToBeast = aBeast。distanceFromPoint(x; y); if(distanceToBeast 《 distanceToNearest) { nearestBeast = aBeast; distanceToNearest = distanceToBeast; } } // Rule 1: Match average speed of those // in the list: currentSpeed = totalSpeed / seen。size(); // Rule 2: Move towards the perceived // center of gravity of the herd: currentDirection = totalBearing / seen。size(); // Rule 3: Maintain a minimum distance // from those around you: 644 …………………………………………………………Page 646…………………………………………………………… if(distanceToNearest field。maxSpeed) { currentSpeed = field。maxSpeed; } } } else { // You are in front; so slow down currentSpeed = (int)(currentSpeed * field。decayRate); } // Make the beast move: x += (int)(Math。cos(currentDirection) * currentSpeed); y += (int)(Math。sin(currentDirection) * currentSpeed); x %= field。xExtent; y %= field。yExtent; if(x 《 0) x += field。xExtent; if(y 《 0) y += field。yExtent; } public float bearingFromPointAlongAxis ( int originX; int originY; float axis) { // Returns bearing angle of the current Beast // in the world coordiante system try { double bearingInRadians = Math。atan( (this。y originY) / (this。x originX)); // Inverse tan has two solutions; so you // have to correct for other quarters: if(x 《 originX) { if(y 《 originY) { bearingInRadians += (float)Math。PI; } else { bearingInRadians = (float)Math。PI bearingInRadians; } } // Just subtract the axis (in radians): return (float) (axis bearingInRadians); } catch(ArithmeticException aE) { // Divide by 0 error possible on this if(x 》 originX) { return 0;