﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-可爱的java-文章分类-java学习</title><link>http://www.blogjava.net/aldmd/category/19690.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 04 Apr 2007 02:16:29 GMT</lastBuildDate><pubDate>Wed, 04 Apr 2007 02:16:29 GMT</pubDate><ttl>60</ttl><item><title>所有漂亮的代码跑哪里去了?</title><link>http://www.blogjava.net/aldmd/articles/98677.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 08 Feb 2007 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/articles/98677.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/98677.html</wfw:comment><comments>http://www.blogjava.net/aldmd/articles/98677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/98677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/98677.html</trackback:ping><description><![CDATA[06年5月9日在拉斯韦加斯举办了ServerSide Java 会议。会上，Gregor Hohpe对一位Java高手说，每个软件开发团队只雇佣最好的最优秀的程序员，这肯定是对的。Google公司软件架构师Hohpe问道:“又有哪家公司会说我们要雇用不聪明的工程师呢?”他认为不好的程序员肯定是在计算机科学领域中受罪。<br /><br />不过，Hohpe质疑，假如所有的应用开发项目都使用首回合的草案，他如何才能发现代码中的缺陷。当他发现代码中存在“这是个错误”或者“需要进行核查”等注释时，他很不满意。最佳的最优秀的程序员怎么能够写出这样的代码和注释呢?<br /><br />他一边不断重复着自己的关键词，一边问:“所有漂亮的代码跑哪里去了?”他用开玩笑的语气这样调侃软件开发:“大概是门卫在半夜进来把我们的代码搞得乱七八糟吧。”<br /><br />就像Hohpe所见到的情况一样，代码很多时候是被很一般的可以防止的原因搞乱的。其中的首要原因就是拙劣的代码引起更多拙劣的代码。他的理论是，如果某个应用程序的最初的开发人员不自己的代码规划清晰，让任何程序员都可以理解，那么潘多拉的盒子就会被打开。<br /><br />接下来的事情从开发人员编写代码开始，即使代码可以运行，但是代码本身是很难让其他程序员理解的。接着，在应用上马之后，某个程序员要做一年的维护。代码变成了一堆乱七八糟的东西。<br /><br />所以，可能第二个做维护的程序员在修改时，会对自己说:“我只在这里添加我的代码。它不会坏到哪里去的。”<br /><br />但经过上面这样的几轮修改后，原先由最优秀的人编写的特性代码，终于变得越来越糟糕。<br /><br />他向出席ServerSide会议的听众提供了一些避免以上事情发生的几点建议。他说:“被强迫写出的代码不会好到哪里去。要让下一个人觉得你是在花大力气编写优雅的代码。”作为一个架构师，他首先要懂得建模对应用程序的价值。他说，这并不需要很复杂的建模工具，甚至在一张纸上的画模型都可以有很好的效果。<br /><br />Hohpe反复强调程序员应该是为人写代码，而不是为机器写代码。他说:“要对人们交互行为进行建模。当涉及用户界面时，这一点尤其重要。”他建议向非程序员展示应用程序，来观察程序员对于程序工作的理解对于潜在的最终用户是否正确。<br /><br />他提醒道，所谓的业务逻辑并非总是和程序员所想的一样。他说:“假如业务逻辑真的和程序员想的一样，那么就不会这么困难了。这也是为什么说找到最终用户究竟如何与应用程序交互非常重要的原因。”<br /><br />他敦促Java程序员利用Java的经验来编写设计好的代码，让其他程序员觉得优雅。“为人而不是机器编写代码”是Hohpe思想的核心。他建议，如果程序员仅仅只为机器写代码，那么他们就不需要Java，他们可以回到汇编代码的时代。<img src ="http://www.blogjava.net/aldmd/aggbug/98677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-02-08 10:23 <a href="http://www.blogjava.net/aldmd/articles/98677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]你还在用if else吗？</title><link>http://www.blogjava.net/aldmd/articles/98676.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 08 Feb 2007 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/articles/98676.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/98676.html</wfw:comment><comments>http://www.blogjava.net/aldmd/articles/98676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/98676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/98676.html</trackback:ping><description><![CDATA[原作者：<a href="http://www.jdon.com/aboutme.htm">板桥里人</a> http://www.jdon.com 2006/1/11<br /><br /><p>　　面向过程设计和面向对象设计的主要区别是：是否在业务逻辑层使用冗长的if else判断。如果你还在大量使用if else，当然，界面表现层除外，即使你使用Java/C#这样完全面向对象的语言，也只能说明你的思维停留在传统的面向过程语言上。</p><p><strong>传统思维习惯分析</strong></p><p>　　为什么会业务逻辑层使用if else，其实使用者的目的也是为了重用，但是这是面向过程编程的重用，程序员只看到代码重用，因为他看到if else几种情况下大部分代码都是重复的，只有个别不同，因此使用if else可以避免重复代码，并且认为这是模板Template模式。</p><p>　　他范的错误是：程序员只从代码运行顺序这个方向来看待它的代码，这种思维类似水管或串行电路，水沿着水管流动（代码运行次序），当遇到几个分管（子管），就分到这几个分管子在流动，这里就相当于碰到代码的if else处了。</p><p>　　而使用OO，则首先打破这个代码由上向下顺序等同于运行时的先后循序这个规律，代码结构不由执行循序决定，由什么决定呢？由OO设计；设计模式会取代这些if else，但是最后总是由一个Service等总类按照运行顺序组装这些OO模块，只有一处，这处可包含事务，一般就是Service，EJB中是Session bean。</p><p>　　一旦需求变化，我们更多的可能是Service中各个OO模块，甚至是只改动Service中的OO模块执行顺序就能符合需求。</p><p>　　这里我们也看到OO分离的思路，将以前过程语言的一个Main函数彻底分解，将运行顺序与代码其他逻辑分离开来，而不是象面向过程那样混乱在一起。所以有人感慨，OO也是要顺序的，这是肯定的，关键是运行顺序要单独分离出来。</p><p>　　是否有if else可以看出你有没有将运行顺序分离到家。</p><p><strong>设计模式的切入口</strong></p><p>　　经常有人反映，设计模式是不错，但是我很难用到，其实如果你使用if else来写代码时（除显示控制以外），就是在写业务逻辑，只不过使用简单的判断语句来作为现实情况的替代者。</p><p>　　 还是以大家熟悉的论坛帖子为例子，如ForumMessage是一个模型，但是实际中帖子分两种性质：主题贴（第一个根贴）和回帖（回以前帖子的帖子），这里有一个朴素的解决方案：<br />建立一个ForumMessage，然后在ForumMessage加入isTopic这样判断语句，注意，你这里一个简单属性的判断引入，可能导致你的程序其他地方到处存在if else 的判断。</p><p>　　如果我们改用另外一种分析实现思路，以对象化概念看待，实际中有主题贴和回帖，就是两种对象，但是这两种对象大部分是一致的，因此，我将ForumMessage设为表达主题贴；然后创建一个继承ForumMessage的子类ForumMessageReply作为回帖，这样，我在程序地方，如Service中，我已经确定这个Model是回帖了，我就直接下溯为ForumMessageReply即可，这个有点类似向Collection放入对象和取出时的强制类型转换。通过这个手段我消灭了以后程序中if else的判断语句出现可能。</p><p>　　从这里体现了，如果分析方向错误，也会导致误用模式。</p><p>　　讨论设计模式举例，不能没有业务上下文场景的案例，否则无法决定是否该用模式，下面举两个对比的例子：</p><p>　　第一.<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=24681" target="_blank"><font color="#002c99"> 这个帖子</font></a>中举例的第一个代码案例是没有上下文的，文中只说明有一段代码：</p><table cellspacing="1" cellpadding="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td>main() { 
<p>if（case A）{ </p><p>//do with strategy A </p><p>}else(case B){</p><p>//do with strategy B </p><p>}else(case C){ </p><p>//do with strategy C </p><p>}</p><p>} </p></td><td> </td></tr></tbody></table><p>　　这段代码只是纯粹的代码，没有业务功能，所以，在这种情况下，我们就很难确定使用什么模式，就是一定用策略模式等，也逃不过还是使用if else的命运，设计模式不是魔法，不能将一段毫无意义的代码变得简单了，只能将其体现的业务功能更加容易可拓展了。</p><p>　　第二.在<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=24333&amp;message=14484871#14484871" target="_blank"><font color="#002c99">这个帖子</font></a>中，作者举了一个PacketParser业务案例，这段代码是体现业务功能的，是一个数据包的分析，作者也比较了各种模式使用的不同，所以我们还是使用动态代理模式或Command模式来消灭那些可能存在的if else</p><p>　　由以上两个案例表明：业务逻辑是我们使用设计模式的切入点，而在分解业务逻辑时，我们习惯则可能使用if else来实现，当你有这种企图或者已经实现代码了，那么就应该考虑是否需要重构Refactoring了。<br /></p><p><strong>if else替代者</strong></p><p>　　那么实战中，哪些设计模式可以替代if else呢？其实GoF设计模式都可以用来替代if else，我们分别描述如下：</p><li>状态模式　<br />　　当数据对象存在各种可能性的状态，而且这种状态将会影响到不同业务结果时，那么我们就应该考虑是否使用状态模式，当然，使用状态模式之前，你必须首先有内存状态这个概念，而不是数据库概念，因为在传统的面向过程的/面向数据库的系统中，你很难发现状态的，从数据库中读取某个值，然后根据这个值进行代码运行分流，这是很多初学者常干的事情。参考文章:<a href="http://www.jdon.com/artichect/state.htm" target="_blank"><font color="#002c99">状态对象：数据库的替代者</font></a><br />　　使用传统语言思维的情况还有：使用一个类整数变量标识状态：<br /><table cellspacing="1" cellpadding="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td><p> </p><p>public class Order{</p><p>private int status;</p><p>//说明： </p><p>//status=1 表示订货但为查看 ；</p><p>//status=2 表示已经查看未处理；</p><p>//status=3 表示已经处理未付款</p><p>//status=4 表示已经付款未发货</p><p>//status=5 表示已经发货</p><p>} </p></td></tr></tbody></table><br />　　上述类设计，无疑是将类作为传统语言的函数来使用，这样导致程序代码中存在大量的if else。<br /><br /></li><li>策略模式　<br />　　当你面临几种算法或者公式选择时，可以考虑策略模式，传统过程语言情况是：从数据库中读取算法数值，数值1表示策略1，例如保存到数据库；数值为2表示策略2，例如保存到XMl文件中。这里使用if else作为策略选择的开关。 <br /><br /></li><li>command模式　<br />　　传统过程的思维情况是：如果客户端发出代号是1或"A"，那么我调用A.java这个对象来处理；如果代号是2或"B"，我就调用B.java来处理，通过if else来判断客户端发送过来的代码，然后按事先约定的对应表，调用相应的类来处理。<br /><br /></li><li>MVC模式　<br />　　MVC模式的传统语言误用和Command模式类似，在一个Action类中，使用if else进行前后台调度，如果客户端传送什么命令；我就调用后台什么结果；如果后台处理什么结构，再决定推什么页面，不过，现在我们使用Struts/JSF这样MVC模式的框架实现者就不必范这种低级错误。<br /><br /></li><li>职责链模式　<br />　　职责链模式和Command模式是可选的，如果你实在不知道客户端会发出什么代号；也没有一个事先定义好的对照表，那么你只能编写一个个类去碰运气一样打开这个包看一下就可以。与Command是不同在<a href="http://www.jdon.com/AOPdesign/decorator.htm" target="_blank"><font color="#002c99">AOP vs Decorator</font></a>一文中有分析。<br /><br /></li><li>代理或动态代理模式　<br />　　代理对象可以是符合某种条件的代表者，比如，权限检验，传统面向过程思维是：当一个用户登陆后，访问某资源时，使用if else进行判断，只有某种条件符合时，才能允许访问，这样权限判断和业务数据逻辑混乱在一起，使用代理模式可以清晰分离，如果嫌不太好，使用动态代理，或者下面AOP等方式。<br /><br /></li><li>AOP或Decorator模式<br />　　<br />　　其实使用filter过滤器也可以替代我们业务中的if else，过滤器起到一种过滤和筛选作用，将符合本过滤器条件的对象拦截下来做某件事情，这就是一个过滤器的功能，多个过滤器组合在一起实际就是if else的组合。<br />　　所以，如果你实在想不出什么办法，可以使用过滤器，将过滤器看成防火墙就比较好理解，当客户端有一个请求时，经过不同性质的防火墙，这个防火墙是拦截端口的；那个防火墙是安全检查拦截等等。过滤器也如同红蓝白各种光滤镜；红色滤镜只能将通过光线中的红色拦截了；蓝色滤镜将光线中的蓝色拦截下来，这实际上是对光线使用if else进行分解。<br /><br /><img height="182" src="http://www.jdon.com/artichect/images/ifelse.gif" width="285" /><br />　　如图，通过一个个条件过滤器我们立体地实现了对信号的分离，如果你使用if else，说明你是将图中的条件1/2/3/4合并在一起，在同一个地方实现条件判断。<br />　　需要深入了解过滤器的实现细节和微小区别，请参考文章：<a href="http://www.jdon.com/AOPdesign/decorator.htm" target="_blank"><font color="#002c99">AOP vs Decorator</font></a><br /><p><strong>OO设计的总结</strong>　　 </p><p>　　还有一种伪模式，虽然使用了状态等模式，但是在模式内部实质还是使用if else或switch进行状态切换或重要条件判断，那么无疑说明还需要进一步努力。更重要的是，不能以模式自居，而且出书示人。</p><p>　　真正掌握面向对象这些思想是一件困难的事情，目前有各种属于揪着自己头发向上拔的解说，都是误人子弟的，所以我觉得初学者读Thinking in Java（Java编程思想）是没有用，它试图从语言层次来讲OO编程思想，非常失败，作为语言参考书可以，但是作为Java体现的OO思想的学习资料，就错了。</p><p>　　OO编程思想是一种方法论，方法论如果没有应用比较，是无法体会这个方法论的特点的，禅是古代一个方法论，悟禅是靠挑水砍柴这些应用才能体会。</p><p>　　那么OO思想靠什么应用能够体会到了？是GoF设计模式，GoF设计模式是等于软件人员的挑水砍柴等基本活，所以，如果一个程序员连基本活都不会，他何以自居OO程序员？从事OO专业设计编程这个工作，如果不掌握设计模式基本功，就象一个做和尚的人不愿意挑水砍柴，他何以立足这个行业？早就被师傅赶下山。</p><p>　　最后总结：将if else用在小地方还可以，如简单的数值判断；但是如果按照你的传统习惯思维，在实现业务功能时也使用if else，那么说明你的思维可能需要重塑，你的编程经验越丰富，传统过程思维模式就容易根深蒂固，想靠自己改变很困难；建议接受<a href="http://www.jdon.com/trainning/j2eearchitect.htm" target="_blank"><font color="#002c99">专业头脑风暴培训</font></a>。</p><p>　　用一句话总结：如果你做了不少系统，很久没有使用if else了，那么说明你可能真正进入OO设计的境地了。（这是本人自己发明的实战性的衡量考核标准）。</p><p>相关资料：</p><p><a href="http://www.jdon.com/mda/modeling.html" target="_blank"><font color="#002c99">面向对象与领域建模 </font></a></p><p><a href="http://www.jdon.com/designpatterns/index.htm" target="_blank"><font color="#002c99">GoF设计模式</font></a></p><p><a href="http://www.jdon.com/artichect/coupling.htm" target="_blank"><font color="#002c99">软件最大的追求是什么？</font></a></p><p><a href="http://www.jdon.com/artichect/dbover.htm" target="_blank"><font color="#002c99">数据库时代的终结</font></a><br /></p></li><img src ="http://www.blogjava.net/aldmd/aggbug/98676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-02-08 10:22 <a href="http://www.blogjava.net/aldmd/articles/98676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java编程技巧：列表排序</title><link>http://www.blogjava.net/aldmd/articles/97388.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 01 Feb 2007 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/articles/97388.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/97388.html</wfw:comment><comments>http://www.blogjava.net/aldmd/articles/97388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/97388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/97388.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> [摘自：CSDN <a href="http://dev.csdn.net/article/31/31142.shtm">http://dev.csdn.net/article/31/31142.shtm</a>] 
<p><font color="#a52a2a">在Java Collection Framework中定义的List实现有Vector，ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而，它们并没有内置的元素排序支持.</font></p><p><font color="#a52a2a">你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递一个List对象，也可以传递一个List和一个Comparator。如果列表中的元素全都是相同类型的类，并且这个类实现了Comparable接口，你可以简单的调用Collections.sort()。如果这个类没有实现Comparator，你也可以传递一个Comparator到方法sort()中，进行排序。如果你不想使用缺省的分类顺序进行排序，你同样可以传递一个Comparator到方法sort()中来进行排序。如果列表中的元素并不都是相同类型的类，你在进行排序的时候就不是这样幸运了。除非你编写一个专用的跨类的Comparator。</font></p><p><font color="#a52a2a">　　排序的顺序怎么样呢？如果元素是String对象，却省的排序顺序是按照字符编码进行的，基本上是每个字符的ASCII/Unicode值。如果严格的限制在处理英文，却省的排序顺序通常是足够的，因为它首先排A-Z，然后是小写字母a-z。然而如果你处理非英文字，或者你只是想使用不同的排序顺序，这样Collections.sort()就出现了第二种变化。例如，你想使用字符串的反序进行排序。为了实现这个功能，你可以在Collections类中通过reverseOrder()来获取一个反序Comparator。然后，你将反序Comparator传递给sort()方法。换句话说，你作如下工作： </font></p><p></p><table width="100%" bgcolor="#ffffff"><tbody><tr><td><font color="#a52a2a">List list = ...;<br />Comparator comp = Collections.reverseOrder();<br />Collections.sort(list, comp);</font></td></tr></tbody></table><p><font color="#a52a2a">　　如果列表包含项目：Man, man, Woman, 和woman，排序好的列表将是Man, Woman, man, woman。这里没有什么复杂的。需要注意的非常重要的一点是Collections.sort()是进行原位排序。如果你需要保留原序，需要先对原集合进行复制，在排序，就像这样：</font></p><p></p><table width="100%" bgcolor="#ffffff"><tbody><tr><td><font color="#a52a2a">List list = ...;<br />List copyOfList = new ArrayList(list);<br />Collections.sort(copyOfList);</font></td></tr></tbody></table><p><font color="#a52a2a">　　这里，排好序的列表是：Man, Woman, man, woman，但是原始列表（Man, man, Woman, woman）被保留了。</font></p><p><font color="#a52a2a">　　到目前为止，排序是区分大小写的。你如何进行不去分大小写的排序呢？一种实现方式是象这样实现Comparator: </font></p><p></p><table width="100%" bgcolor="#ffffff"><tbody><tr><td><font color="#a52a2a">public static class CaseInsensitiveComparator <br />implements Comparator {<br />public int compare(Object element1, <br />Object element2) {<br />String lower1 = <br />element1.toString().toLowerCase();<br />String lower2 = <br />element2.toString().toLowerCase();<br />return lower1.compareTo(lower2);<br />}<br />}</font></td></tr></tbody></table><p><font color="#a52a2a">　　你确实不需要手工的创建这个类。而是，你可以是用以存在的Comparator，CASE_INSENSIVTIVE_ORDER，它是在String类中定义的。</font></p><p><font color="#a52a2a">　　这种实现方式有一点小小的问题。Sort()算法提供稳定的排序，并保持与原有序列相同的元素。这意味着一个包含两个元素”woman”和”Woman”的列表将有不同的排序，而这种不同是根据两个元素在列表中出现的先后次序决定的。</font></p><p><font color="#a52a2a">　　语言的不同又会怎么样呢？java.text包提供了Collector和CollectionKey类来进行区分语言的排序。这里是例子:</font></p><p><font color="#a52a2a">　　注意，如果你的文本是本地语言，而不是缺省语言，你需要传递一个本地语种给getInstance()方法，就象: </font></p><p></p><table width="100%" bgcolor="#ffffff"><tbody><tr><td><font color="#a52a2a">public static class CollatorComparator <br />implements Comparator {<br />Collator collator = Collator.getInstance();<br />public int compare(Object element1, <br />Object element2) {<br />CollationKey key1 = collator.getCollationKey(<br />element1.toString());<br />CollationKey key2 = collator.getCollationKey(<br />element2.toString());<br />return key1.compareTo(key2);<br />}<br />}</font></td></tr></tbody></table><p><font color="#a52a2a">　　你是在对集合关键字进行排序，而不是实际的字符串。这不仅提供固定的不区分大小写的排序，而且它是跨语种的排序。换句话说，如果你对西班牙文和非西班牙文的混合词进行排序，词ma?ana (tomorrow)将排在mantra的前面。如果你不使用Collector，ma?ana将排在mantra的后面。</font></p><p><font color="#a52a2a">　　下面这个程序对一个列表进行不同类型的排序（缺省的、区分大小写的、区分语种的）：</font></p><p></p><table width="100%" bgcolor="#ffffff"><tbody><tr><td><font color="#a52a2a">import java.awt.BorderLayout;<br />import java.awt.Container;<br />import java.io.*;<br />import java.text.*;<br />import java.util.*;<br />import javax.swing.*;<br /><br />public class SortIt {<br /><br />public static class CollatorComparator <br />implements Comparator {<br />Collator collator = Collator.getInstance();<br />public int compare(Object element1, <br />Object element2) {<br />CollationKey key1 = collator.getCollationKey(<br />element1.toString());<br />CollationKey key2 = collator.getCollationKey(<br />element2.toString());<br />return key1.compareTo(key2);<br />}<br />}<br /><br />public static class CaseInsensitiveComparator <br />implements Comparator {<br />public int compare(Object element1, <br />Object element2) {<br />String lower1 = element1.toString().<br />toLowerCase();<br />String lower2 = element2.toString().<br />toLowerCase();<br />return lower1.compareTo(lower2);<br />}<br />}<br /><br />public static void main(String args[]) {<br />String words[] = <br />{"man", "Man", "Woman", "woman", <br />"Manana", "manana", "ma?ana", "Ma?ana",<br />"Mantra", "mantra", "mantel", "Mantel"<br />};<br /><br />// Create frame to display sortings<br />JFrame frame = new JFrame("Sorting");<br />frame.setDefaultCloseOperation(<br />JFrame.EXIT_ON_CLOSE);<br />Container contentPane = frame.getContentPane();<br />JTextArea textArea = new JTextArea();<br />JScrollPane pane = new JScrollPane(textArea);<br />contentPane.add(pane, BorderLayout.CENTER);<br /><br />// Create buffer for output<br />StringWriter buffer = new StringWriter();<br />PrintWriter out = new PrintWriter(buffer);<br /><br />// Create initial list to sort<br />List list = new ArrayList(Arrays.asList(words));<br />out.println("Original list:");<br />out.println(list);<br />out.println();<br /><br />// Perform default sort<br />Collections.sort(list);<br />out.println("Default sorting:");<br />out.println(list);<br />out.println();<br /><br />// Reset list <br />list = new ArrayList(Arrays.asList(words));<br /><br />// Perform case insensitive sort<br />Comparator comp = new CaseInsensitiveComparator();<br />Collections.sort(list, comp);<br />out.println("Case insensitive sorting:");<br />out.println(list);<br />out.println();<br /><br />// Reset list<br />list = new ArrayList(Arrays.asList(words));<br /><br />// Perform collation sort<br />comp = new CollatorComparator();<br />Collections.sort(list, comp);<br />out.println("Collator sorting:");<br />out.println(list);<br />out.println();<br /><br />// Fill text area and display<br />textArea.setText(buffer.toString());<br />frame.pack();<br />frame.show();<br />}<br />}</font></td></tr></tbody></table><p><font color="#a52a2a">　　如果你的主要问题是顺序访问，可能列表不是你的好的数据结构选择。只要你的集合没有重复，你可以在树（TreeSet）中保存你的元素（提供或不提供Comparator）。这样，元素将总是排序形式的。</font></p></span>
<img src ="http://www.blogjava.net/aldmd/aggbug/97388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-02-01 23:23 <a href="http://www.blogjava.net/aldmd/articles/97388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>