`
linliangyi2007
  • 浏览: 1017834 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Graceful Java Programming 之使用Collection排序

阅读更多
一.TreeSet 、 TreeMap
时间复杂度: log(n)
方法一: 对存入TreeSet的对象和put到TreeMap的key实现java.util.Comparable接口
代码样例:
 
public class TokenDelegate implements Comparable{
//词元的起始位移
private int offset;
    //词元的起始位置
    private int begin;
    //词元的终止位置
    private int end;
   ......
   ......
    
    /*
     * 词元在排序集合中的比较算法
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    public int compareTo(Object o){
        TokenDelegate ntd = (TokenDelegate)o;
        if(this.begin < ntd.begin){
            return -1;
        }else if (this.begin == ntd.begin){
            //当起始位置相同时,长词优先
            if( this.end > ntd.end ){
                return -1;
            }else if(this.end == ntd.end){
                return 0;
            }else if(this.end < ntd.end){
                return 1;
            }
        }
        return 1;
    }
    ......
    ......
}


方法二:为对象实现java.util.Comparator,并通过构造函数传给TreeSet或TreeMap
代码样例:
 
class BusLineNameComparator implements Comparator{ 
        ...... 
        ...... 
        /**
         * 公交线路查询结果排序器
         * @param one
         * @param other
         * @return
         */
        public int compare(Object one , Object other){
            if(one == other){
                return 0;
            }
            if(one instanceof LBSBusLine && other instanceof LBSBusLine){
                LBSBusLine busLineA = (LBSBusLine)one;
                LBSBusLine busLineB = (LBSBusLine)other;
                String busNameA = busLineA.getName();
                String busNameB = busLineB.getName();
                //判断是否同一条线路
                if(busLineA.equals(busLineB)){
                    return 0;
                }
                //判断公交线路名称长度
                if(busNameA.length() < busNameB.length()){
                    return -1;
                }else if(busNameA.length() > busNameB.length()){
                    return 1;
                }else{
                    return busNameA.compareTo(busNameB);
                }
            }else{
                throw new java.lang.ClassCastException("Not LBSBusLine Type.");
            }
         }
      }
     ......
     ...... 
}

这里要提醒大家注意的是对于TreeSet中的对象和TreeMap的key,判断对象是否相等不是根据对象的equals方法实现的,而是根据对象的compareTo()实现或者比较器Comparator中的compare方法是否返回0来鉴别的,这一点在实现比较器的排序和集合的contain判别中尤为重要。


二.使用java.util.Collections.sort对List排序,其时间复杂度为n*log(n)。

使用java.util.Collections.sort方法同样可以通过对象自身实现Comparable接口,或者为sort方法给定Comparator实现来完成排序.这里不做复述。同TreeSet不同的是,用java.util.Collections.sort对List进行排序允许List中两个元素的compareTo()或compare()方法返回0,既允许概念上两个重复元素的共存于List中。这也符合了数学概念上Set和List的区别。
2
1
分享到:
评论
2 楼 linliangyi2007 2008-03-29  
楼上是英文大牛,很需要想您这样的人出来,为加强中国程序界同国外同行的沟通添砖加瓦,尤其是在开源社区中!!
1 楼 vinhsu 2008-03-28  
引用
这里要提醒大家注意的是对于TreeSet中的对象和TreeMap的key,判断对象是否相等不是根据对象的equals方法实现的,而是根据对象的 compareTo()实现或者比较器Comparator中的compare方法是否返回0来鉴别的,这一点在实现比较器的排序和集合的contain 判别中尤为重要。


I want to add one comment from JDK:

The ordering imposed by a Comparator c on a set of elements S is said to be consistent with equals if and only if (compare((Object)e1, (Object)e2)==0) has the same boolean value as e1.equals((Object)e2) for every e1 and e2 in S.

JSK recommend developer takes care for equals to be consistent even thought collections.sort doesn't use.

相关推荐

    Laravel开发-graceful-cache

    - `README.md`:项目介绍和使用指南,通常会包含如何安装、配置以及使用`graceful-cache`的详细步骤。 为了在你的Laravel项目中使用`graceful-cache`,你需要按照`README.md`中的指示安装依赖并进行配置。一旦完成...

    前端开源库-graceful-kill

    3. 如何使用graceful-kill graceful-kill库提供了一个简单的API,可以方便地集成到项目中。首先,你需要安装这个库,通过npm命令`npm install graceful-kill`。然后,在需要的地方引入并使用,如下所示: ```...

    前端开源库-graceful-ncp

    3. **流式操作**:`graceful-ncp`允许开发者使用流接口来处理大文件,避免一次性加载大量数据到内存中,从而降低了资源消耗。 4. **可定制性**:用户可以根据需要自定义过滤规则,只复制特定类型的文件或跳过某些...

    前端开源库-graceful-readlink

    在`graceful-readlink-master`这个压缩包中,可能包含了`graceful-readlink`的源代码、测试用例、文档以及安装和使用的指南。通过阅读源代码,你可以深入理解它是如何实现“优雅”的读取操作的,而测试用例则可以...

    graceful-fs-fs模块的一个替代拥有各种改进

    同时,测试用例可以帮助理解graceful-fs的各种功能和用法,确保在实际使用中能够充分利用其优势。 总的来说,graceful-fs是一个针对Node.js fs模块的优化库,通过队列管理、错误重试、符号链接处理等功能,提高了...

    Functional Programming in C++

    Mastering the functional style of programming can help you tackle the demands of modern apps and will lead to simpler expression of complex program logic, graceful error handling, and elegant ...

    Laravel开发-graceful-laravel-workers

    3. **优雅关闭(Graceful Shutdown)**:在“graceful-laravel-workers”中,主要目标是实现优雅关闭,即在接收到停止命令时,工作进程会等待当前处理的任务完成后再退出,确保数据的一致性和完整性。 4. **...

    BGP Graceful Restart

    【BGP Graceful Restart】是BGP(Border Gateway Protocol)的一种特性,旨在确保在路由器或协议处理组件(如Route Processor,RP)重启时,路由信息的连续性和稳定性,避免网络中断。这一特性允许BGP Speaker...

    前端开源库-graceful-fs-extra

    本文将深入探讨`graceful-fs-extra`库的核心特性、使用方法以及在实际项目中的应用。 ### 1. fs-extra概述 `fs-extra`是Node.js社区中广泛使用的文件系统操作库,它的目标是提供一个比原生`fs`模块更强大且易于...

    Graceful Graph

    优雅图(Graceful Graph)是图论中的一个概念,它源于数学和计算机科学,特别是网络流和图遍历的问题。这个概念是由美国数学家Edward G. Kolaitis在1970年代提出的,目的是研究图的标号特性。在英特尔线程挑战赛3月...

    Go-graceful优雅的重载http服务器零宕机时间兼容systemdsupervisor

    本文将深入探讨如何使用Go-graceful库来实现优雅的HTTP服务器重载,确保在更新服务时实现零宕机时间,并同时兼容systemd和supervisor这两种常见的系统管理工具。 `Go-graceful`是一个专门设计用于处理HTTP服务器的...

    graceful:使用Server.Shutdown正常关闭Go 1.8+服务器

    优美 安装 go get -u github.com/TV4/graceful 用法 package main import ( "log" "net/http" "time" "github.com/TV4/graceful" ) type server struct {} func ( s * server ) ... time .... w .... log .... graceful . L

    A fresh 3D image slider with graceful fallback

    标题 "A fresh 3D image slider with graceful fallback" 指的是一种新型的3D图像轮播组件,它带有优雅的回退功能。在网页设计中,图像轮播是一种常见且吸引用户注意力的方式,用于展示多张图片或内容。3D效果则为...

    express-graceful-exit, 为了得到零停机,优雅地退出 Express.zip

    express-graceful-exit, 为了得到零停机,优雅地退出 Express express-graceful-exit具有零停机时间的组件为 node.js 使用 Express 部署。 它是为 3. X, 开发的,因此它可能需要与 Express 2.x 兼容。这个模块最初是...

    RFC8538 Notification Message Support for BGP Graceful Restart

    如果不满足,则发送BGP Cease NOTIFICATION消息,并使用特定子代码指示硬重启。 3. **Hold Time到期**:当Hold Time到期时,同样按照上述逻辑进行处理。 4. **执行优雅重启或硬重启**:根据接收到的消息类型和当前...

    javaAJAX无刷技术

    在实际开发中,为了兼容各种浏览器和提升用户体验,开发者通常会结合使用AJAX和其他技术,例如使用渐进增强(Progressive Enhancement)或优雅降级(Graceful Degradation)策略,确保即使在JavaScript禁用或不支持...

    开源项目-gobwas-graceful.zip

    开发者可以通过阅读这些代码了解如何在自己的项目中集成和使用 gobwas-graceful。 6. **API 文档**:虽然未直接提供,但为了充分利用这个库,开发者需要熟悉其提供的 API,包括创建、启动和停止优雅服务器的方法,...

    fastify-graceful-shutdown:正常关机即可固定

    :bow_and_arrow: 平稳关闭 ... 不能与以外的其他记录器一起使用,因为我们使用子记录器功能来封装日志。 使用fastify onClose挂钩释放插件中的资源。 经过一定的超时(默认10秒)后,该进程将退出,以防止进程卡死。

Global site tag (gtag.js) - Google Analytics