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

java的容器排序

    博客分类:
  • JDK
阅读更多

    在项目开发中,经常回用到容器排序,而它们的写法比较固定,今天就来总结一下.

pojo类如下:

package com.ldh;

public class Student implements Comparable<Student> {
    private int    id;
    private String name;
    private int    age;

    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public int compareTo(Student o) {
        return new Integer(age).compareTo(new Integer(o.getAge()));
    }
}

    再创建四个Student对象:

    

   Student st1 = new Student();
    st1.setName("zhangsan1");
    st1.setId(1);
    st1.setAge(30);
    
    Student st2 = new Student();
    st2.setName("zhangsan2");
    st2.setId(2);
    st2.setAge(20);
    
    Student st3 = new Student();
    st3.setName("zhangsan3");
    st3.setId(3);
    st3.setAge(10);
    
    Student st4 = new Student();
    st4.setName("zhangsan4");
    st4.setId(4);
    st4.setAge(10);
    用TreeSet对上述四个Student对象排序并打印出结果:
   Set<Student> set = new TreeSet<Student>();
    set.add(st1);
    set.add(st2);
    set.add(st3);
    set.add(st4);
    
    for(Student st : set){
        System.out.println(st.getAge());
    }
    System.out.println(set.size());

 

打印出的结果如下:

 10

 20

 30

 3

TreeSet底层排序算法是二叉树,如果两个元素比较的结果为0,就被视为同一个元素.如果 Student没有实现Comparable接口,也可以通过以下方式实现排序:

 

Set<Student> set = new TreeSet<Student>(new Comparator<Student>() {
		@Override
		public int compare(Student o1, Student o2) {
			 return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge())                  );
		}
	});
        最终打印出的结果和实现Comparable接口一样.TreeSet的底层实现结构是TreeMap,TreeSet就是value都相同的TreeMap,因此TreeMap也有上述两种排序方式.

 

    再看来看一下List的排序,同样是上面的四个对象,都实现Comparable接口.
    List<Student> slist = new LinkedList<Student>();
    slist.add(st1);
    slist.add(st2);
    slist.add(st3);
    slist.add(st4);
    Collections.sort(slist);
    for(Student st : slist){
        System.out.println(st.getAge());
    }
    System.out.println(slist.size());
     上面这段代码打印的结果是
      10
      10
       20
       30
        4
       通过上面的结果可以看到,List排序四个元素都打印出来,并且按正序排序,如果想按倒序排序,只需要
 @Override
    public int compareTo(Student o) {
        return -new Integer(age).compareTo(new Integer(o.getAge()));
    }
        在原来的基础上加一个"-"负号就可以了.
        同样List也可以用实现Comparator接口进行排序,如下:
       
 List<Integer> list = new LinkedList<Integer>();
  list.add(new Integer(5));
  list.add(new Integer(3));
  list.add(new Integer(4));
  list.add(new Integer(3));
  Collections.sort(list, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 - o2;
        }
    });
    for(Integer letter : list){
        System.out.println(letter);
    }
    System.out.println(list.size());
    
    排序结果:
    3
    3
    4
    5
    4      
         List的实现ArrayList也同样可以上面的两种排序,LinkedList是链表结构,增加,删除效率高,但查找由于要移动指针,效率就低了.ArrayList底层的实现了基于动态数组的数据结构,查找效率高,但增加,删除由于涉及到数据移动,效率就没有LinkedList高了.实际项目具体用哪一个,看实际情况.
      对于容器排序是实现Comparable接口还是Comparator接口,我推荐Comparator接口,因为Comparator与原来的代码的耦合性低,比如刚开始的需求不需要排序,而后来又需要排序,但又想尽量少动原来的代码,Comparator接口就比较适合了.同时对于同一个对象,有的地方想这样排,另一个地方又想那样排,这是你发现还是Comparator比较好,多实现几个Comparator就行了.
 
 
 
 
分享到:
评论

相关推荐

    秘钥容器排序源代码JAVA

    密钥是一种参数,它是在明文转换为密文或将密文转换为明文的...将秘钥容器中的所有秘钥按照f(k)升序排列,以便观察秘钥的安全性。 数据结构综合应用、排序算法综合应用、算法设计 程序可在eclipse直接导入,亲测可用

    Java容器.xmind

    对键进行排序 HashTable 标记: class Properties 标记: class 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。 Collections 标记: 均以synchronized实现, 性能没用提高 synchronizedCollection...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 使用容器排序 Vector由于使用了synchronized方法(线程安全)

    Java 容器类——书籍、作者信息

    1结合GUI包在DOS窗口具有添加作者和书籍的功能。(做成GUI界面) 2具有查询一本书所有作者基本信息的功能。包括我只想查某一个属性 3具有查询一个作者所有书目的功能 ...5 具有对所有作者按客户指定类型排序的功能

    实验5 Java Io 与容器实验指导书

    编写一个Java项目,包含两个类StudentJavaScore和...StudentJavaScore用于存储学生姓名和Java成绩,并实现了Comparable接口.ScoreOperation类包含5个方法,对学生成绩进行查询、排序,并实现字符串中字符计数操作。

    JAVA上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    JAVA上百实例源码以及开源项目源代码

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    Java集合容器面试题(2023最新版)-重点

    Java集合容器面试题(2023最新版)-重点 **集合框架:**用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合...

    一款好看的发卡源码 java项目 java发卡源码 一键部署.zip

    2.安装好后进入java找到容器管理安装tomcat8安装版本 3.web项目管理添加项目,项目域名填写你的域名,项目端口为8085 4.创建后进去项目路径,上传源码并解压,创建数据库,导入数据库文件,配置数据库信息 5.后台地 ...

    JAVA面试核心知识点整理283页-2020.pdf.zip

    并发编程,并发编程各大容器,锁。框架spring mybatis原理,组件介绍。架构设计有设计模式,负载均衡。网络有协议,java 高并发io框架netty。数据结构包括堆栈,队列,链表,二叉树,红黑树,算法包括各种排序,贪心...

    java数据结构源代码

    java数据结构 树 排序 查找 容器,还有数组之类的,全是用Java源代码写的。

    java开源包4

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包101

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    并发容器和线程池,java并发编程3

    JDK提供的这些容器⼤部分在java.util.concurrent包中。我们挑选出⼀些⽐较有代表性的并发容器 1 类,来感受⼀下JDK⾃带的并发集合带来的“快感”。 ConcurrentLinkedQueue是⼀个基于链接节点的⽆界线程安全队列,它...

    java开源包11

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包6

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包9

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    尚硅谷Java视频Java8新特性视频教程

    尚硅谷_Java8新特性_Optional 容器类 ·16. 尚硅谷_Java8新特性_接口中的默认方法与静态方法 ·17. 尚硅谷_Java8新特性_传统时间格式化的线程安全问题 ·18. 尚硅谷_Java8新特性_新时间与日期 API-本地时间与时间戳...

Global site tag (gtag.js) - Google Analytics