文档章节

Collections的sort方法

圣洁之子
 圣洁之子
发布于 2014/08/30 12:25
字数 617
阅读 524
收藏 0

通过Collections的sort方法对List进行排序,有两种方法实现:

  1. List<T>中的对象应实现Comparable接口,并实现其compareTo方法

    //需要比较的对象类PersonH

public class PersonH implements Comparable<PersonH>
{

	private int level;
	
	public Integer getLevel()
	{
		return level;
	}
	public void setLevel(Integer level1)
	{
		this.level = level1;
	}
	@Override
	public int compareTo(PersonH o)
	{
	  return this.getLevel().compareTo(o.getLevel());		
	}	
}

//Main类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		PersonH person  = new PersonH();
		person.setLevel(6);
		PersonH person2 = new PersonH();
		person2.setLevel(8);
		PersonH person3 = new PersonH();
		person3.setLevel(3);
		List<PersonH> personList = new ArrayList<PersonH>();
		
		personList.add(person);
		personList.add(person2);
		personList.add(person3);
		
		Collections.sort(personList);//排序
		for(PersonH personH : personList) //输出排序后结果
		{
			System.out.print(personH.getLevel() + "\t");
		}
	}

}

//运行结果:3 6 8

这种方式相当于类PersonH具备了指定的基本排序策略,因它实现了compareTo方法

2. 根据Collections.sort重载之,来实现

//PersonH类

public class PersonH 
{
	private int level;
	
	public Integer getLevel()
	{
		return level;
	}
	public void setLevel(Integer level1)
	{
		this.level = level1;
	}	
}

//Main类

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		PersonH person  = new PersonH();
		person.setLevel(6);
		PersonH person2 = new PersonH();
		person2.setLevel(8);
		PersonH person3 = new PersonH();
		person3.setLevel(3);
		ArrayList<PersonH> personList = new ArrayList<PersonH>();
		
		personList.add(person);
		personList.add(person2);
		personList.add(person3);
		//这里可以更加灵活地指定比较策略,第一种实现方法是在要比较对象的类中就固定了比较策略。
		Collections.sort(personList,new Comparator<PersonH>()
		{
			public int compare(PersonH p1,PersonH p2)
			{
				return p1.getLevel().compareTo(p2.getLevel());
			}
		});
		for(PersonH personH : personList)
		{
			System.out.print(personH.getLevel() + "\t");
		}
	}

}

//运行结果:3 6 8

下面看一下该方法是如何进行排序的:

对于第一种:

    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        Object[] a = list.toArray();
        Arrays.sort(a);
        ListIterator<T> i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set((T)a[j]);
        }
    }
    public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a);
    }
    /** To be removed in a future release. */
    private static void legacyMergeSort(Object[] a) {
        Object[] aux = a.clone();
        mergeSort(aux, a, 0, a.length, 0);
    }

对于第二种:

    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set(a[j]);
        }
    }
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, c);
    }

    /** To be removed in a future release. */
    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
        T[] aux = a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }

总之,两种方式都是通过mergeSort和TimSort实现的。

首先看是否指定排序策略,如果没有,则和第一种走一样的逻辑;否则进行指定比较策略的归并排序。

mergeSort函数的源代码可以参考java.util.Arrays类。


本文转载自:http://blog.csdn.net/ydd326/article/details/6761447

圣洁之子
粉丝 10
博文 402
码字总数 124050
作品 0
深圳
后端工程师
私信 提问
排序——升序降序的使用

前言 在做项目的过程中,偶尔会用到对集合中数据进行升序降序的排列问题,问题不是很难,但有时处理起来非常浪费时间,于是今天就把排序问题稍微处理了下,整理成一个排序工具类——Compare...

奔跑的佩恩
2017/12/26
0
0
浅谈 Java 自定义排序之 Comparator

  排序是编程中经常需要用到的功能,而 Java 的工具类 Collections 中也提供了 sort 方法用于实现对列表等集合中元素的排序。Collections.sort() 方法有两种形式: 和 。   第一种 要求 ...

Amstrong
2016/10/01
567
0
java基础—— Collections.sort的两种用法,简单明了 。

java基础—— Collections.sort的两种用法,简单明了 。 /** * @author guwh * @version 创建时间:2011-11-3 上午10:49:36 * 类说明 */ package com.jabberchina.test; import java.util.Ar......

大陆大陆
2016/07/11
18
0
java中Collections.sort() 排序函数的用法

用Collections.sort方法对list排序有两种方法 一.第一种是list中的对象实现Comparable接口 /*** 根据order对User排序*/public class User implements Comparable<User>{ private String nam......

谢思华
2016/01/14
153
0
Collections.sort(List list) list排序学习笔记

先上代码: 运行结果: aa bb cg ee 上面初步对Collections.sort的应用做了一个简单的描述。 下面的篇章我们将会Collections.sort实现进行解析:见代码和代码注释 废话再说俩句,竟然要排序,...

dmrs
2015/10/18
17
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
37分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
46分钟前
4
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
47分钟前
4
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
52分钟前
4
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
55分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部