锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鐢╦ava api榪涜sort
Sun鎺堟潈鍒婄櫥
銆銆鏈妭涓墍鎻忚堪鐨勫鎬佺畻娉?錛坧olymorphic algorithms錛夋槸鐢?JDK 鎵鎻愪緵鐨勫彲閲嶅浣跨敤鐨勫姛鑳芥х墖孌點傚畠浠潎鍙栬嚜Collections綾伙紝騫墮兘閲囩敤闈欐佹柟娉曪紙瀹冪殑絎竴涓弬鏁版槸鎵ц鎿嶄綔鐨?瀵硅薄闆嗭級鐨勫艦寮忋傜敱Java騫沖彴鎵鎻愪緵鐨勭粷澶у鏁扮畻娉曢兘鎿嶄綔浜嶭ist瀵硅薄錛屼絾鏈変袱涓?(min 鍜?max) 鎿嶄綔浜庝換鎰廋ollection瀵硅薄銆備互涓嬫槸鍏充簬綆楁硶鐨勬弿榪?br />
銆銆鎺掑簭錛圫orting錛?
銆銆鎺掑簭綆楁硶鍙負涓涓?List 閲嶆柊鎺掑簭錛屼互浣垮畠鐨勫厓绱犳寜鐓ф煇縐嶆帓搴忓叧緋繪垚涓婂崌寮忔帓搴忋傛湁涓ょ褰㈠紡鐨勬搷浣滆鎻愪緵銆傜畝鍗曞艦寮忕殑鎿嶄綔鍙噰鐢ㄤ竴涓?List 騫舵寜鐓у畠鐨勫厓绱犵殑鑷劧鎺掑簭榪涜鎺掑簭銆傚鏋滀綘瀵硅嚜鐒舵帓搴忕殑姒傚康涓嶇啛鎮夛紝閭d箞搴旇閲嶆柊闃呰 瀵硅薄鎺掑簭錛圤bject Ordering錛?
銆銆sort 鎿嶄綔浣跨敤鍋氫簡浜涗紭鍖栫殑鍚堝茍鎺掑簭錛坢erge sort錛?綆楁硶銆傚鏋滀綘涓嶇煡閬撳畠鐨勫惈涔夛紝鑰屽張寰堢湅閲嶅畠鐨勮瘽錛?璇烽槄璇誨叧浜庣畻娉曠殑浠繪剰涓縐嶆暀縐戜功銆傝繖涓畻娉曠殑閲嶈涔嬪鏄細
蹇? 榪欎釜綆楁硶琚繚璇佽繍琛屽湪 n log(n) 鏃墮棿鍐咃紝騫跺湪宸插熀鏈帓搴忕殑鍒楄〃涓婏紝瀹冪殑閫熷害瀹炶川涓婃洿蹇傜粡楠岃〃鏄庯紝瀹冪殑閫熷害涓庨珮搴︿紭鍖栫殑蹇熸帓搴忥紙quicksort錛夌殑閫熷害宸笉澶氾紝 Quicksort 涓鑸璁や負蹇簬鍚堝茍鎺掑簭錛屼絾瀹冧笉紼沖畾錛屽茍涓嶄繚璇?n log(n)鎬ц兘銆?
銆銆紼沖畾: 榪欏氨鏄錛屽畠涓嶄負鐩哥瓑鐨勫厓绱犻噸鏂版帓搴忋傚鏋滀綘涓虹浉鍚岀殑鍒楄〃鍋氫笉鍚屽睘鎬х殑閲嶅鎺掑簭錛岃繖涓鐐瑰浣犳潵璇存槸鍗佸垎閲嶈鐨勩傚鏋滀竴涓偖浠剁▼搴忕殑鐢ㄦ埛涓哄畠鐨勯偖浠剁鎸夋棩鏈熸帓搴忥紝鐒跺悗鍙堟寜鍙戜歡浜烘帓搴忥紝榪欎釜鐢ㄦ埛鑷劧鍦版湡鏈涙煇涓壒瀹氬彂浠朵漢鐨勭幇鍦ㄧ浉閭葷殑娑堟伅鍒楄〃灝嗭紙浠嶇劧錛夋寜鏃ユ湡鎺掑簭銆傝繖涓鐐瑰彧鏈夊湪絎簩涓帓搴忔槸紼沖畾鐨勬椂鍊欐墠鑳藉緱浠ヤ繚璇併?br />
銆銆浠ヤ笅鏄?涓涓皬紼嬪簭錛屽畠鍙寜璇嶅吀錛堝瓧姣嶏級欏哄簭鎵撳嵃瀹冪殑鍙傛暟錛?
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]
銆銆婕旂ず榪欎釜紼嬪簭鍙槸涓轟簡琛ㄧず鎴戞槸姣棤淇濈暀鐨勶細榪欎釜綆楁硶紜疄鏄薄瀹冧滑鎵鏄劇幇鐨勯偅鏍風畝鍗曘傛垜涓嶆兂浣庝及浣犵殑鑳藉姏鑰屾紨紺烘洿鍌葷殑渚嬪瓙銆?
銆銆絎簩縐嶅艦寮忕殑 sort闄ら噰鐢ㄤ竴涓?List 澶栵紝榪橀噰鐢ㄤ竴涓?Comparator 騫朵笖浣跨敤 Comparator 瀵瑰厓绱犺繘琛屾帓搴忋傝繕璁板緱鍦?Map 璇劇▼緇撴潫鏃剁殑鎺掑垪緇勭殑渚嬪瓙鍚? 瀹冧互涓涓潪鐗瑰畾鐨勯『搴忔墦鍗板嚭鎺掑垪緇勩傚亣璁句綘瑕佷互鐩稿弽鐨勫ぇ灝忛『搴忔墦鍗板畠浠紝澶х殑鎺掑垪鍦ㄥ墠闈€備笅鍒椾緥瀛愬皢鍛婅瘔浣犲浣曞熷姪 sort 鏂規硶鐨勭浜岀褰㈠紡鑰岃揪鍒頒綘鐨勭洰鐨勩?
鍥炴兂涓涓嬶紝鎺掑簭琛ㄦ槸浠?List 瀵硅薄鐨勫艦寮忎綔涓轟竴涓?Map 涓殑鍊艱岃瀛樺偍鐨勩備慨鏀瑰悗鐨勬墦鍗頒唬鐮侀氳繃 Map 鐨?values瑙嗗浘榪涜榪唬, 灝嗘瘡涓涓氳繃鏈灝忓昂瀵告祴璇曠殑List鏀捐繘List 涔嬩腑銆傜劧鍚庯紝浠g爜浣跨敤涓涓湡鏈?List 瀵硅薄鐨?Comparator 涓鴻繖涓?List 鎺掑簭錛屽茍瀹炵幇鍙嶈漿澶у皬鎺掑簭銆傛渶緇堬紝浠g爜閫氳繃鐜板湪宸叉帓搴忕殑 List 榪涜榪唬錛屾墦鍗板畠鐨勫厓绱狅紙鎺掑簭緇勶級銆傝繖涓唬鐮佸湪 Perm 鐨?main 鏂規硶鏈熬鏇夸唬浜嗘墦鍗頒唬鐮?
// 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 璇劇▼涓嬌鐢ㄧ殑鐩稿悓鐨勮瘝鍏歌繍琛?榪欎釜紼嬪簭 錛屽茍浣跨敤鐩稿悓鐨勬渶灝忔帓搴忕粍灝哄錛?錛夛紝浼氫駭鐢熶笅鍒楄緭鍑?
% 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
娣鋒帓錛圫huffling錛?br />
銆銆娣鋒帓綆楁硶鎵鍋氱殑姝eソ涓?sort 鐩稿弽: 瀹冩墦涔卞湪涓涓?List 涓彲鑳芥湁鐨勪換浣曟帓鍒楃殑韙抗銆備篃灝辨槸璇達紝鍩轟簬闅忔満婧愮殑杈撳叆閲嶆帓璇?List, 榪欐牱鐨勬帓鍒楀叿鏈夌浉鍚岀殑鍙兘鎬э紙鍋囪闅忔満婧愭槸鍏鐨勶級銆傝繖涓畻娉曞湪瀹炵幇涓涓榪愭皵鐨勬父鎴忎腑鏄潪甯告湁鐢ㄧ殑銆備緥濡傦紝瀹冨彲琚敤鏉ユ販鎺掍唬琛ㄤ竴鍓墝鐨?Card 瀵硅薄鐨勪竴涓?List 銆傚彟澶栵紝鍦ㄧ敓鎴愭祴璇曟渚嬫椂錛屽畠涔熸槸鍗佸垎鏈夌敤鐨勩?
銆銆榪欎釜鎿嶄綔鏈変袱縐嶅艦寮忋傜涓縐嶅彧閲囩敤涓涓?List 騫朵嬌鐢ㄩ粯璁ら殢鏈烘簮銆傜浜岀瑕佹眰璋冪敤鑰呮彁渚涗竴涓?Random 瀵硅薄浣滀負闅忔満婧愩傝繖涓畻娉曠殑涓浜涘疄闄呬唬鐮佹浘鍦?List 璇劇▼涓浣滀負渚嬪瓙浣跨敤銆?
銆銆甯歌鏁版嵁鎿嶄綔錛圧outine Data Manipulation錛?br />
銆銆Collections 綾諱負鍦?List 瀵硅薄涓婄殑甯歌鏁版嵁鎿嶄綔鎻愪緵浜嗕笁縐嶇畻娉曘傝繖浜涚畻娉曟槸鍗佸垎綆鍗曟槑浜嗙殑:
銆銆reverse: 鍙嶈漿鍦ㄤ竴涓垪琛ㄤ腑鐨勫厓绱犵殑欏哄簭銆?br />
銆銆fill: 鐢ㄧ壒瀹氬艱鐩栧湪涓涓?List 涓殑姣忎竴涓厓绱犮傝繖涓搷浣滃鍒濆鍖栦竴涓?List 鏄崄鍒嗘湁鐢ㄧ殑銆?br />
銆銆copy: 鐢ㄤ袱涓弬鏁幫紝涓涓洰鏍?List 鍜屼竴涓簮 List, 灝嗘簮鐨勫厓绱犳嫹璐濆埌鐩爣錛屽茍瑕嗙洊瀹冪殑鍐呭銆傜洰鏍?List 鑷沖皯涓庢簮涓鏍烽暱銆傚鏋滃畠鏇撮暱錛屽垯鍦ㄧ洰鏍?List 涓殑鍓╀綑鍏冪礌涓嶅彈褰卞搷銆?br />
銆銆鎼滅儲錛圫earching錛?br />
銆銆binary search 錛堜簩榪涘埗鎼滅儲錛夌畻娉曠敤浜岃繘鍒舵悳绱㈢畻娉曞湪涓涓凡鎺掑簭鐨?List 涓鎵劇壒瀹氬厓绱犮傝繖涓畻娉曟湁涓ょ褰㈠紡銆傜涓縐嶉噰鐢ㄤ竴涓?List 鍜屼竴涓瀵繪壘鐨勫厓绱?( "鎼滅儲閿紙search key錛?)銆傝繖縐嶅艦寮忓亣璁?List 鏄寜鐓у畠鐨勫厓绱犵殑鑷劧鎺掑簭鎺掑垪鎴愪笂鍗囬『搴忕殑銆傜浜岀褰㈠紡闄ら噰鐢?List 澶栵紝榪橀噰鐢ㄤ竴涓?Comparator 浠ュ強鎼滅儲閿紝騫跺亣璁?List 鏄寜鐓х壒瀹?Comparator 鎺掑垪鎴愪笂鍗囬『搴忕殑銆?鎺掑簭綆楁硶(鎻忚堪瑙佷笂) 鍙紭鍏堜簬 binarySearch 鑰岃鐢ㄦ潵涓篖ist 鎺掑簭銆?
銆銆涓ょ褰㈠紡鐨勮繑鍥炲兼槸鐩稿悓鐨? 濡傛灉 List 鍖呭惈鎼滅儲閿紝瀹冪殑绱㈠紩灝嗚榪斿洖錛涘鏋滀笉鍖呮嫭錛屽垯榪斿洖鍊間負 (-(insertion point) - 1), 榪欓噷鐨?insertion point 琚畾涔変負涓涓偣錛屼粠榪欎釜鐐硅鍊煎皢琚彃鍏ュ埌榪欎釜 List 涓細澶т簬璇ュ肩殑絎竴涓厓绱犵殑浣嶇疆绱㈠紩錛屾垨list.size()銆?閫夌敤榪欎釜涓嶅彲鍚﹁鐨勯毦鐪嬬殑鍏紡鏄負浜嗕繚璇佸鏋滀笖浠呭鏋滄悳绱㈤敭琚彂鐜幫紝鍒欒繑鍥炲煎皢絳変簬0銆傚畠鍩烘湰涓婃槸涓涓皢甯冨皵閫昏緫 ("found") 鍜屾暣鏁?("index") 緇煎悎鍒板崟涓鐨刬nt榪斿洖鍊肩殑澶ф潅鐑┿?
銆銆涓嬪垪鎯敤紼嬪簭瀵?binarySearch 鎿嶄綔鐨勪袱縐嶅艦寮忓潎閫傜敤錛屽畠瀵繪壘鐗瑰畾鎼滅儲閿紝濡傛灉鎼滅儲閿笉鍑虹幇錛屽垯灝嗗畠鎻掑叆鍒伴傚綋鐨勪綅緗?
int pos = Collections.binarySearch(l, key);
if (pos < 0)
l.add(-pos-1, key);
銆銆瀵繪壘鏋佸鹼紙Finding Extreme Values錛?
銆銆min 鍜?max 綆楁硶鍒嗗埆榪斿洖鍖呭惈鍦ㄧ壒瀹?Collection 涓殑鏈灝忓拰鏈澶у厓绱犮傝繖涓や釜鎿嶄綔閮藉悇鏈変袱縐嶅艦寮忥紝綆鍗曞艦寮忓彧閲囩敤涓涓?Collection, 騫舵寜鐓у厓绱犵殑鑷劧鎺掑簭榪斿洖鏈灝?(鎴栨渶澶? 鍏冪礌錛涘彟涓縐嶅艦寮忛櫎閲囩敤 Collection 涔嬪錛岃繕閲囩敤涓涓?Comparator錛屽茍鎸夌収鐗瑰畾 Comparator榪斿洖鏈灝忥紙鎴栨渶澶э級鍏冪礌銆?
銆銆榪欎簺灝辨槸鐢盝ava 騫沖彴鎻愪緵鐨勪綔鐢ㄤ簬涓?List 瀵硅薄鐩稿鐨勪換鎰?Collection 瀵硅薄涓婄殑浠呮湁綆楁硶錛屽氨璞′笂闈㈡彁鍒扮殑 fill 綆楁硶涓鏍鳳紝榪欎簺綆楁硶閮芥槸闈炲父綆鍗曟槑浜嗙殑錛屽畠浠槸Java騫沖彴涓虹▼搴忓憳鐗瑰埆鎻愪緵鐨勪究鍒╁伐鍏楓?/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: 緇熶竴澶勭悊欏甸潰闂寸殑鍙傛暟浼犻?lt;/p>
聽* @author Administrator
聽*
聽*/
public class ddd extends TagSupport {
聽 private String paraNames = null;聽 //鍙傛暟涓?浠ebConfig.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,濡傛灉涓嶈兘鍦╮equest鑼冨洿鍐呮壘鍒扮浉搴攏ame鐨勫弬鏁?璁劇疆鍊間負WebConfig.NULL=""
聽聽 * 2,濡傛灉atrribute,parameter涓悓鏃跺瓨鍦ㄥ悓鍚嶇殑鍙傛暟,浠ttribute涓負涓?br />聽聽 * 3,灝嗘墍鏈塲sp欏甸潰鎵闇鐨勫弬鏁拌漿鎹負attribute淇濆瓨,鍦╦sp欏甸潰涓氳繃<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);
聽聽聽 }
聽 }
}
鐩稿叧綾?br />package com.taglib.pageparameter;
public class WebConfig{
聽聽聽public static final String SEPARATE=";";//鍓嶅彴web鍙傛暟闂撮殧紱葷鍙?br />聽聽聽public final static String NULL = "";聽 //欏甸潰闂村弬鏁頒紶閫?name涓虹┖鏃惰緗殑緙虹渷鍊?br />}
浜屻佹爣絳懼畾涔塼ld鏂囦歡
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 />鍥涖乯sp欏甸潰璋冪敤
<%@ page import="package com.taglib.pageparameter.WebConfig" %>
<%@ taglib uri="/WEB-INF/Archive/PageParameter.tld" prefix="PageParameter" %>
<PageParameter:ParameterTransact paraNames='<%="urlSQL"+WebConfig.SEPARATE+"page"%>'/>
聽聽//娣誨姞搴忓垪鍙峰?br />聽聽buf.append(num);
聽聽return buf.toString();
聽}