??xml version="1.0" encoding="utf-8" standalone="yes"?>
用java apiq行sort
Sun授权刊登
本节中所描述的多态算?Qpolymorphic algorithmsQ是?JDK 所提供的可重复使用的功能性片Dc它们均取自Collectionsc,q采用静态方法(它的W一个参数是执行操作?对象集)的Ş式。由Javaq_所提供的绝大多数算法都操作于List对象Q但有两?(min ?max) 操作于Q意Collection对象。以下是关于法的描q?br />
排序QSortingQ?
排序法可ؓ一?List 重新排序Q以使它的元素按照某U排序关pL上升式排序。有两种形式的操作被提供。简单Ş式的操作只采用一?List q按照它的元素的自然排序q行排序。如果你对自然排序的概念不熟悉,那么应该重新阅读 对象排序QObject OrderingQ?
sort 操作使用做了些优化的合ƈ排序Qmerge sortQ?法。如果你不知道它的含义,而又很看重它的话Q?请阅d于算法的L一U教U书。这个算法的重要之处是:
快? q个法被保证运行在 n log(n) 旉内,q在已基本排序的列表上,它的速度实质上更快。经验表明,它的速度与高度优化的快速排序(quicksortQ的速度差不多, Quicksort 一般被认ؓ快于合ƈ排序Q但它不E_Qƈ不保?n log(n)性能?
E_: q就是说Q它不ؓ相等的元素重新排序。如果你为相同的列表做不同属性的重复排序Q这一点对你来说是十分重要的。如果一个邮件程序的用户为它的邮件箱按日期排序,然后又按发g人排序,q个用户自然地期望某个特定发件h的现在相ȝ消息列表(仍然Q按日期排序。这一点只有在W二个排序是E_的时候才能得以保证?br />
以下?一个小E序Q它可按词典Q字母)序打印它的参数Q?
import java.util.*;
public class Sort {
public static void main(String args[]) {
List l = Arrays.asList(args);
Collections.sort(l);
System.out.println(l);
}
}
让我们运行这个程序:
% java Sort i walk the line
[i, line, the, walk]
演示q个E序只是Z表示我是毫无保留的:q个法实是象它们所昄的那L单。我不想低估你的能力而演C更ȝ例子?
W二UŞ式的 sort除采用一?List 外,q采用一?Comparator q且使用 Comparator 对元素进行排序。还记得?Map 评l束时的排列l的例子? 它以一个非特定的顺序打印出排列l。假设你要以相反的大顺序打印它们,大的排列在前面。下列例子将告诉你如何借助 sort Ҏ的第二种形式而达C的目的?
回想一下,排序表是?List 对象的Ş式作Z?Map 中的D被存储的。修改后的打C码通过 Map ?values视图q行q代, 每一个通过最尺寸测试的List放进List 之中。然后,代码使用一个期?List 对象?Comparator ?List 排序Qƈ实现反{大小排序。最l,代码通过现在已排序的 List q行q代Q打印它的元素(排序l)。这个代码在 Perm ?main Ҏ末尾替代了打C?
// Make a List of all permutation groups above size threshold
List winners = new ArrayList();
for (Iterator i = m.values().iterator(); i.hasNext(); ) {
List l = (List) i.next();
if (l.size() = minGroupSize)
winners.add(l);
}
// Sort permutation groups according to size
Collections.sort(winners, new Comparator() {
public int compare(Object o1, Object o2) {
return ((List)o2).size() - ((List)o1).size();
}
});
// Print permutation groups
for (Iterator i=winners.iterator(); i.hasNext(); ) {
List l = (List) i.next();
System.out.println(l.size() + ": " + l);
}
用与 Map 评中用的相同的词典运?q个E序 Qƈ使用相同的最排序组寸Q?Q,会生下列输?
% java Perm dictionary.txt 8
12: [apers, apres, asper, pares, parse, pears, prase, presa, rapes,
reaps, spare, spear]
11: [alerts, alters, artels, estral, laster, ratels, salter, slater,
staler, stelar, talers]
10: [least, setal, slate, stale, steal, stela, taels, tales, teals,
tesla]
9: [estrin, inerts, insert, inters, niters, nitres, sinter, triens,
trines]
9: [capers, crapes, escarp, pacers, parsec, recaps, scrape, secpar,
spacer]
9: [anestri, antsier, nastier, ratines, retains, retinas, retsina,
stainer, stearin]
9: [palest, palets, pastel, petals, plates, pleats, septal, staple,
tepals]
8: [carets, cartes, caster, caters, crates, reacts, recast, traces]
8: [ates, east, eats, etas, sate, seat, seta, teas]
8: [arles, earls, lares, laser, lears, rales, reals, seral]
8: [lapse, leaps, pales, peals, pleas, salep, sepal, spale]
8: [aspers, parses, passer, prases, repass, spares, sparse, spears]
8: [earings, erasing, gainers, reagins, regains, reginas, searing,
seringa]
8: [enters, nester, renest, rentes, resent, tenser, ternes, treens]
8: [peris, piers, pries, prise, ripes, speir, spier, spire]
上一?1 2 3 下一?amp;#61496;
a
hQShufflingQ?br />
h法所做的正好?sort 相反: 它打乱在一?List 中可能有的Q何排列的t迹。也是_Z随机源的输入重排?List, q样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰q气的游戏中是非常有用的。例如,它可被用来排代表一副牌?Card 对象的一?List 。另外,在生成测试案例时Q它也是十分有用的?
q个操作有两UŞ式。第一U只采用一?List q用默认随机源。第二种要求调用者提供一?Random 对象作ؓ随机源。这个算法的一些实际代码曾?List 评中被作ؓ例子使用?
常规数据操作QRoutine Data ManipulationQ?br />
Collections cMؓ?List 对象上的常规数据操作提供了三U算法。这些算法是十分单明了的:
reverse: 反{在一个列表中的元素的序?br />
fill: 用特定D盖在一?List 中的每一个元素。这个操作对初始化一?List 是十分有用的?br />
copy: 用两个参敎ͼ一个目?List 和一个源 List, 源的元素拷贝到目标Qƈ覆盖它的内容。目?List 臛_与源一样长。如果它更长Q则在目?List 中的剩余元素不受影响?br />
搜烦QSearchingQ?br />
binary search Q二q制搜烦Q算法用二进制搜索算法在一个已排序?List 中寻扄定元素。这个算法有两种形式。第一U采用一?List 和一个要L的元?( "搜烦键(search keyQ?)。这UŞ式假?List 是按照它的元素的自然排序排列成上升顺序的。第二种形式除采?List 外,q采用一?Comparator 以及搜烦键,q假?List 是按照特?Comparator 排列成上升顺序的?排序法(描述见上) 可优先于 binarySearch 而被用来为List 排序?
两种形式的返回值是相同? 如果 List 包含搜烦键,它的索引被q回Q如果不包括Q则q回gؓ (-(insertion point) - 1), q里?insertion point 被定义ؓ一个点Q从q个点该值将被插入到q个 List 中:大于该值的W一个元素的位置索引Q或list.size()?选用q个不可否认的难看的公式是ؓ了保证如果且仅如果搜索键被发玎ͼ则返回值将{于0。它基本上是一个将布尔逻辑 ("found") 和整?("index") l合到单一的intq回值的大杂烩?
下列惯用E序?binarySearch 操作的两UŞ式均适用Q它L特定搜烦键,如果搜烦键不出现Q则它插入到适当的位|?
int pos = Collections.binarySearch(l, key);
if (pos < 0)
l.add(-pos-1, key);
L极|Finding Extreme ValuesQ?
min ?max 法分别q回包含在特?Collection 中的最和最大元素。这两个操作都各有两UŞ式,单Ş式只采用一?Collection, q按照元素的自然排序q回最?(或最? 元素Q另一UŞ式除采用 Collection 之外Q还采用一?ComparatorQƈ按照特定 Comparatorq回最(或最大)元素?
q些是由Java q_提供的作用于?List 对象相对的Q?Collection 对象上的仅有法Q就象上面提到的 fill 法一Pq些法都是非常单明了的Q它们是Javaq_为程序员特别提供的便利工兗?/td>
]]>
package com.taglib.pageparameter;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
/**
* <p>Title: 参数传递标{?lt;/p>
* <p>Description: l一处理面间的参数传?lt;/p>
* @author Administrator
*
*/
public class ddd extends TagSupport {
private String paraNames = null; //参数?以WebConfig.SEPARATE分隔
public void setParaNames(String paraNames){
this.paraNames = paraNames ;
}
public String getParaNames(){
return this.paraNames;
}
public int doStartTag(){
if(this.paraNames==null)
return EVAL_BODY_INCLUDE;
String[] paras = this.paraNames.split(WebConfig.SEPARATE);
this.transactPara(pageContext,paras);
return EVAL_BODY_INCLUDE ;
}
public int doEndTag(){
return EVAL_PAGE ;
}
/**
* 处理参数传?br /> * 规则:
* 1,如果不能在request范围内找到相应name的参?讄gؓWebConfig.NULL=""
* 2,如果atrribute,parameter中同时存在同名的参数,以attribute中ؓ?br /> * 3,所有jsp面所需的参数{换ؓattribute保存,在jsp面中通过<bean:write name="attributeName" />调用
* 4,涉及处理的参数包?String[] args
* @param pageContext PageContext
* @param args String[]
*/
public void transactPara(PageContext pageContext,String[] args){
for (int i = args.length ; --i >= 0;) {
ServletRequest request = pageContext.getRequest() ;
Object attr=(String)request.getAttribute(args[i]);
String para=request.getParameter(args[i]);
if(attr==null)
request.setAttribute(args[i], para==null?WebConfig.NULL:para);
}
}
}
相关c?br />package com.taglib.pageparameter;
public class WebConfig{
public static final String SEPARATE=";";//前台web参数间隔ȝ?br /> public final static String NULL = ""; //面间参C?name为空时设|的~省?br />}
二、标{֮义tld文g
PageParameter.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>PageParameter</shortname>
<info></info>
<tag>
<name>ParameterTransact</name>
<tagclass>com.taglib.pageparameter.PageParameterTag</tagclass>
<bodycontent>empty</bodycontent>
<info></info>
<attribute>
<name>paraNames</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
三、在web.xml中加载标{?br />四、jsp面调用
<%@ page import="package com.taglib.pageparameter.WebConfig" %>
<%@ taglib uri="/WEB-INF/Archive/PageParameter.tld" prefix="PageParameter" %>
<PageParameter:ParameterTransact paraNames='<%="urlSQL"+WebConfig.SEPARATE+"page"%>'/>
//d序列号?br /> buf.append(num);
return buf.toString();
}