文档章节

Collections.sort(List list) list排序学习笔记

maskleo
 maskleo
发布于 2015/10/18 20:07
字数 991
阅读 12
收藏 0
点赞 0
评论 0

先上代码:

class ListSortExample {
	private String flag ;
	
	public ListSortExample(String flag){
		this.flag = flag;
	}
	
	public String getFlag(){
		return this.flag;
	}
	
	public void setFlag(String flag){
		this.flag = flag;
	}
}
/**
 * 比较器,重写compare方法,根据ListSortExample的flag字段来排序ListSortExample
 * 
 */
class ComparatorListSort implements Comparator{
	 public int compare(Object arg0, Object arg1) {
		 ListSortExample example0=(ListSortExample)arg0;
		 ListSortExample example1=(ListSortExample)arg1;
	   //首先比较年龄,如果年龄相同,则比较名字
	  int flag=example0.getFlag().compareTo(example1.getFlag());
	  return flag;
	 }
	 
	}
	public class TestListSort{
		public static void main(String[] args){
			  List<ListSortExample> sortExampleList=new ArrayList<ListSortExample>();
			  sortExampleList.add(new ListSortExample("aa"));
			  sortExampleList.add(new ListSortExample("ee"));
			  sortExampleList.add(new ListSortExample("bb"));
			  sortExampleList.add(new ListSortExample("cg"));
			  
			  Comparator comparator=new ComparatorListSort();
			  //排序--注意:sortExampleList中的对象引用必须被comparator进行比较了,即是:comparator对象的compare方法一定是对sortExampleList中的对象就行比较
			  Collections.sort(sortExampleList, comparator);
			   
			  for (ListSortExample example:sortExampleList){
			      System.out.println(example.getFlag()); 
			  }
			  
			 }
	}
 

 

运行结果:

 

aa

bb

cg

ee

 

 

上面初步对Collections.sort的应用做了一个简单的描述。

 

下面的篇章我们将会Collections.sort实现进行解析:见代码和代码注释

public static <T> void sort(List<T> list, Comparator<? super T> c) {
    //将排序list转化为数组	
	Object[] a = list.toArray();
	//然后调用Arrays的静态方法sort()进行排序,所以说Collections的sort()功能是委派Arrays来实现的,我们重点看看Arrays的sort()方法
	Arrays.sort(a, (Comparator)c);
	
	//这边简单:将排序完成的数组对象中的数据赋值给list对象
	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) {
    	//数组拷贝
    	T[] aux = (T[])a.clone();
            if (c==null)
            	//如果比较器为空,采用默认比较器
                mergeSort(aux, a, 0, a.length, 0);
            else
            	//采用用户自定义的比较器来比较排序
                mergeSort(aux, a, 0, a.length, 0, c);
    }
    
    private static void mergeSort(Object[] src,
			  Object[] dest,
			  int low, int high, int off,
			  Comparator c) {
				int length = high - low;
				//当数组的数据小于或者等于7个时候,直接采用冒泡排序法进行比较,然后返回
				// Insertion sort on smallest arrays
				if (length < INSERTIONSORT_THRESHOLD) {
				  for (int i=low; i<high; i++)
					for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
					    swap(dest, j, j-1);
				  return;
				}
				
				  // Recursively sort halves of dest into src
				  int destLow  = low;
				  int destHigh = high;
				  low  += off;
				  high += off;
				  int mid = (low + high) >>> 1;
				  //如果数组中的个数大于7的话,通过调用递归方法,一直将原数组划分成多个小数组,数组的长度在7之间的,将这些小数组的中的数据按比较器中的规则排好序
					//通过A,B将数组一分为二的,然后再将1/2的数组再次划分为2个,直至最后被划分的数组的长度在7之内,
				  mergeSort(dest, src, low, mid, -off, c);----A //对src[low], src[mid](假如程为数组1)之间的数据进行排序
				  mergeSort(dest, src, mid, high, -off, c);----B//对src[mid], src[high](假如程为数组2)之间的数组进行排序
				  //下面的操作就是将内部已经排序好的数组1,2就行排序
				  // If list is already sorted, just copy from src to dest.  This is an
				  // optimization that results in faster sorts for nearly ordered lists.
				  //当数组2的第一个数据(也就是最小数据)大于数组1的最后一个数据(就是最大数据),直接合并俩数组到到目标数组
				  if (c.compare(src[mid-1], src[mid]) <= 0) {
				     System.arraycopy(src, low, dest, destLow, length);
				     return;
				  }
				
				  // Merge sorted halves (now in src) into dest
				  //否则采用算法,什么算法我也忘了,很简单的,依次比较,将比较好了的数据赋值给目标数组
				  for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
				      if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
				          dest[i] = src[p++];
				      else
				          dest[i] = src[q++];
				  }				  		  
				  
				  
}
 

 

废话再说俩句,竟然要排序,显然就要比较要排序元素的顺序或者大小,而比较器的作用就是用来干这个的。用比较器来实现对排序元素的比较。例如上面的代码:Collections.sort(sortExampleList, comparator);comparator比较器中的compare()方法就是用来比较sortExampleList中的ListSortExample对象。

 

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/morethinkmoretry/article/details/5905678

共有 人打赏支持
maskleo
粉丝 14
博文 128
码字总数 17344
作品 0
深圳
程序员
用Collections.sort方法对list排序的两种方法

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

ychh
2011/11/29
0
0
java集合学习笔记 ---Collections类对集合的处理

包名:java.util.Collections Collections是个类,不是接口 有以下方法,部分列举 1.对List进行升序排序 public static void sort(List list) 如果要进行降序排序,可以在sort函数中制定降序 ...

carlos
2014/03/25
0
0
知识总结:Java集合对象排序

1.List排序 这个和数组的排序又不一样了。 其实Java针对数组和List的排序都有实现,对数组而言,你可以直接使用Arrays.sort,对于List和Vector而言,你可以使用Collections.sort方法 Java A...

牛客网
2017/12/29
0
0
java工具类的使用

一、自定义排序 Collections.sort的两种用法,简单明了 : http://blog.csdn.net/janronehoo/article/details/8746447 http://www.cnblogs.com/liuyuanyuanGOGO/p/javacollections.html Coll......

哎小艾
2016/12/28
3
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
16
0
java中Collections.sort() 排序函数的用法

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

谢思华
2016/01/14
113
0
135246abc 对数字和字母进行排序

package org.xiaozhu.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MyTest { public static void main(String[] args) { List<Ob......

yanxiaozhu_
2012/03/22
0
0
JAVA中几种常见集合的使用实例

Java.util.ArrayList(类): import java.awt.; import java.util.; public class CollectionTest {//List是一个能包含重复元素的已排序的Collection,有时list也称为序列,List第一个元素的...

小梅菜鸟
2012/03/14
0
0
Java8 Lambda表达式之比较器

在这个例子中,我将向你展示如何使用Java8的lambda表达式写的比较器排序列表。 经典例子 Lambda表达式方式 1. 使用Lambda排序 这个例子使用年龄比较对象,通常你使用并且通过一个匿名函数实现...

王爵nice
2015/09/15
853
0
用Java集合中的Collections.sort方法对list排序的两种方法

用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** 根据order对User排序 */public class User implements Comparable{ } 测试一下: public...

Mr&Cheng
2013/05/19
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
20分钟前
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
41分钟前
0
0
HTTP协议通信原理

了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。 HTTP使用...

寰宇01
今天
0
0
【Java动态性】之反射机制

一、Java反射机制简介

谢余峰
今天
1
0
Centos 6.X 部署环境搭建

1.Linux学习笔记CentOS 6.5(一)--CentOS 6.5安装过程

IT追寻者
今天
0
0
博客即同步至腾讯云+社区声明

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8vy9bsmadbko...

xiaoge2016
今天
1
0
大数据教程(3.1):Linux系统搭建网络YUM源服务器

博主在前面的2.5章节讲述了linux系统本地YUM服务器的搭建和httpd轻量级静态网站服务器的安装,本节博主将为大家分享内网环境中搭建自己的网络YUM服务器的全过程。如果大家对本地YUM服务器还不...

em_aaron
今天
1
0
蚂蚁技术专家:一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务...

Java大蜗牛
今天
1
0
新的Steam应用将拓展服务项目

导读 未来几周,Steam将推出两个免费的应用程序Steam Link和Steam Video。这两个应用程序都旨在拓展Steam平台的业务和便利性。 即将开放的Steam Link应用程序最先提供了Android测试版,它将允...

问题终结者
今天
0
0
golang 第三方包的使用总结

golang 第三方包的安装的方法: 1. go get 安装 $ go get github.com/gin-gonic/gin 注意:执行go get 命令需要先安装git命令,并配置git全局变量。 2. 源码包安装 由于国内网络问题,很多时...

科陆李明
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部