自定义引用类型放入集合中,按实际业务需求进行排序的两种思路

第一种思路:

  (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object obj)方法。自定义业务比较规则

  (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者。自己编写排序工具类。冒泡+compareTo(obj)方法

 例子:新闻条目的排序

  需要排序的实体类,实现Comparable接口,重写方法,自定义排序规则

 package com.zdxy.shangxiaofei;

 import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date; import javax.tools.JavaCompiler; /**
* 新闻条目的实体类
* 按时间,点击量,标题。排序
* 【1】时间降序
* 【2】时间相同,点击量升
* 【3】时间相同,点击量相同,标题长度降序。
* @ClassName: NewItem
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-8 下午6:53:18
*
*/
public class NewItem implements java.lang.Comparable<NewItem>{
private String title;//标题
private int hits;//点击量
private Date pubTime;//发布时间 public NewItem() {
super();
} /**
* 第一种思路:实体类实现java.lang.Comparable接口,compareTo方法,在方法中写排序规则
*
* 时间降序+点击量升序+标题降序
* @Title: compareTo
* @Description: TODO(这里用一句话描述这个方法的作用)
* @author 尚晓飞
* @date 2014-8-8 下午6:59:03
* @param o
* @return
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(NewItem o) {
// TODO Auto-generated method stub
int result=0;
//比较发布时间(降序)(内置时间类,有排序功能,但是是升序)
result=-this.pubTime.compareTo(o.pubTime);
//如果发布时间相同,则按点击量排序
if(0==result){
//比较点击量(升序)
result=this.hits-o.hits;
//如果点击量相同,则按标题长度排序(降序)
if(0==result){
//比较标题(长度降序)
result=-this.title.compareTo(o.title);
return result;
}else{
return result;
}
}else{
return result;
}
} /**
* 重写toString方法,方便测试打印
* @Title: toString
* @Description: TODO(这里用一句话描述这个方法的作用)
* @author 尚晓飞
* @date 2014-8-8 下午7:20:55
* @return
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("标题:").append(this.title);
sb.append("---发布时间:").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime));//将时间按某种格式输出
sb.append("---点击量:").append(this.hits).append("\n");//加一个回车 return sb.toString(); } public NewItem(String title, int hits, Date pubTime) {
super();
this.title = title;
this.hits = hits;
this.pubTime = pubTime;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public int getHits() {
return hits;
} public void setHits(int hits) {
this.hits = hits;
} public Date getPubTime() {
return pubTime;
} public void setPubTime(Date pubTime) {
this.pubTime = pubTime;
} }

  利用Collections工具类,对实体类的集合进行排序

 package com.zdxy.shangxiaofei;

 import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List; /**
* 使用Collections进行集合排序(Collections中的排序默认是升序)
* @ClassName: Test
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-8 下午7:12:03
*
*/
public class Test {
public static void main(String[] args) {
List<NewItem> news=new ArrayList<NewItem>();
news.add(new NewItem("小日本,听话,泪流满面",60,new Date(System.currentTimeMillis()-1000*60*60)));
news.add(new NewItem("中国登上钓鱼岛了,全国欢呼",100,new Date()));
news.add(new NewItem("美国后怕了,逃跑了悲剧了", 50, new Date(System.currentTimeMillis()-1000*60*60))); //要求,先按时间降序,再按点击量升序,后按标题降序 //排序前
System.out.println("排序前:"+news); //排序
Collections.sort(news); //排序后
System.out.println("排序后:"+news); /**
* 打印结果
* 排序前:[标题:小日本,听话,泪流满面---发布时间:2014-08-08 18:35:14---点击量:60
, 标题:中国登上钓鱼岛了,全国欢呼---发布时间:2014-08-08 19:35:14---点击量:100
, 标题:美国后怕了,逃跑了悲剧了---发布时间:2014-08-08 18:35:14---点击量:50
]
排序后:[标题:中国登上钓鱼岛了,全国欢呼---发布时间:2014-08-08 19:35:14---点击量:100
, 标题:美国后怕了,逃跑了悲剧了---发布时间:2014-08-08 18:35:14---点击量:50
, 标题:小日本,听话,泪流满面---发布时间:2014-08-08 18:35:14---点击量:60]
*/
}
}

  

第二种思路

  (1)自己编写业务比较规则类。实体类不用实现任何借口。业务比较规则类实现java.util.Comparator接口。重写public int compare(String o1, String o2)方法,编写排序规则

  (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者。自己编写排序工具类。冒泡+compareTo(obj)方法 

一般推荐使用第二种思路。

第二种思路(1)排序规则和实体类解耦。当业务发生变化,可以灵活改变。

     (2)如果项目是接手别的公司,实体类无源代码,则可以编写排序规则业务类。

例子:淘宝商品的排序

实体类+自定义的排序业务类

 package com.zdxy.shangxiaofei;
/**
*按商品的收藏量降序
*按商品的价格升序
*按商品的名字降序
* @ClassName: Goods
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-8 下午7:45:28
*
*/
public class Goods {
private int fav;//收藏量
private double price;//价格
private String name;//商品名 public Goods() {
super();
} public Goods(int fav, double price, String name) {
super();
this.fav = fav;
this.price = price;
this.name = name;
} /**
* 重写toString()便于测试
* @Title: toString
* @Description: TODO(这里用一句话描述这个方法的作用)
* @author 尚晓飞
* @date 2014-8-8 下午7:49:03
* @return
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "商品名:"+this.name+"---收藏量"+this.fav+"---价格:"+this.price;
} public int getFav() {
return fav;
} public void setFav(int fav) {
this.fav = fav;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} } /**
* 只按收藏量进行降序排序的排序业务类
* @ClassName: FavComparator
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-11 上午8:54:22
*
*/
public class FavComparator implements java.util.Comparator<Goods> { @Override
public int compare(Goods o1, Goods o2) {
// TODO Auto-generated method stub
int o1Fav=o1.getFav();
int o2Fav=o2.getFav();
return -(o1Fav-o2Fav);//因为Collections.sort(list,comparator)默认是升序,所以需要加-号
} } /**
* 自定义业务排序类,与实体类解耦。
* 业务需求:
* 【1】先按收藏量进行降序
* 【2】收藏量相同,则按价格升序
* 【3】收藏量和价格都相同,则按名字降序
* @ClassName: AllComparator
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-11 上午9:05:38
*
*/
public class AllComparator implements java.util.Comparator<Goods> { @Override
public int compare(Goods o1, Goods o2) { int result=0;
//先按收藏量进行排序(降序)
result=-(o1.getFav()-o2.getFav());
//如果收藏量相同,相减为O,则按价格升序
if(result==0){
//按价格进行排序(升序)
result=o1.getPrice()-o2.getPrice()>0?1:(o1.getPrice()-o2.getPrice()==0?0:-1);
//如果价格相同,则按,名字进行降序
if(result==0){
//名字降序
result=-(o1.getName().compareTo(o2.getName()));
}
} return result;
} }

利用Collections工具类,对装有商品对象的集合类进行排序

 package com.zdxy.shangxiaofei;

 import java.util.ArrayList;
import java.util.Collections;
import java.util.List; /**
*
* @ClassName: Test2
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-8-8 下午7:52:40
*
*/
public class Test2 {
public static void main(String[] args) {
List<Goods> list=new ArrayList<Goods>();
list.add(new Goods(10, 100, "面包")); list.add(new Goods(50, 200, "a"));
list.add(new Goods(50,200,"k"));
list.add(new Goods(50, 200, "z"));
list.add(new Goods(100, 300, "包子油条"));
list.add(new Goods(50, 100, "牛奶"));
//排序前
System.out.println("排序前:"+list); //排序
Collections.sort(list, new AllComparator()); //排序后()
System.out.println("排序后:"+list);
} //只按收藏量进行排序的业务类的测试
public static void testSort1(List list){
//排序前
System.out.println("排序前:"+list); //排序
Collections.sort(list, new FavComparator()); //排序后(收藏量的降序)
System.out.println("排序后:"+list);
}
}

java编程排序之自定义类型的集合,按业务需求排序的更多相关文章

  1. [Java]如何为一个自定义类型的List排序。

    好吧,三年了,又重拾我的博客了,是因为啥呢,哈哈哈.今天被问到一个题目,当场答不出来,动手动的少了,再此记录下来. Q:有一个MyObject类型的List,MyObject定义如下: class M ...

  2. Java编程思想学习笔记——类型信息

    前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...

  3. 集合(一)-Java中Arrays.sort()自定义数组的升序和降序排序

    默认升序 package peng; import java.util.Arrays;  public class Testexample { public static void main(Stri ...

  4. Java编程思想(十五) —— 类型信息之反射

    讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...

  5. Java将list<map>或者list<entity>集合根据指定字段排序

    今天项目中用到了,特记录一下 一. List<Map> 如果 item.get(sortField) 有时间,有数字的时候直接toString(),数组结果的排序结果可能不正确 List& ...

  6. python第十四课--排序及自定义函数之案例一:选择排序

    案例一:选择排序使用选择排序的思想实现列表数据的升序排序 lt=[45,12,56,-32,-3,44,75,-22,100] length=len(lt) # print('排序前:'+str(lt ...

  7. java利用自定义类型对树形数据类型进行排序

    前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...

  8. java编程排序之内置引用类型的排序规则实现,和自定义规则实现+冒泡排序运用

    第一种排序:[冒泡排序]基本数据类型的排序. [1]最简易的冒泡排序.效率低.因为比较的次数和趟数最多. /** * 最原始的冒泡排序. * 效率低. * 因为趟数和次数最多.都是按最大化的循环次数进 ...

  9. [c#基础]泛型集合的自定义类型排序

    引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...

随机推荐

  1. Android ActionBar自定义

    关于自定义的ActionBar的实现过程,这里做下笔记以供之后查看. 1.默认状态 使用Android Studio新建一个名为“ActionBar”的应用,默认actionbar如图(1)所示. 图 ...

  2. Union、Union All、Intersect、Minus用法和区别

    假设我们有一个表Student,包括以下字段与数据: [c-sharp] view plain copydrop table student;    create table student  (   ...

  3. linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍

    第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建 ...

  4. 一个好玩的CTF题

    一个CTF的题目,拿来学习学习 玩了好久,再加上学校一堆破事,最近又开始瞎弄了,找了几个CTF的题目,和别人写的一些内容,也当是学习,也当是看完之后的小结.顺便也说一下如果自己拿到这题目会从哪做起. ...

  5. HDU 1565 方格取数(1)(最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...

  6. 图像等比例缩放的函数封装(PHP)

    <?php //图像等比例缩放函数 /** *等比例缩放函数(以保存新图片的方式实现) *@param string $picname 被缩放的处理图片源 *@param int $maxx 缩 ...

  7. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  8. http cookie的domain使用

    问题描述 最近遇到了一个因cookie domain设置不正确导致公司自研的分布式session组件无法生效的问题. 公司自研的这套分布式session组件依赖于设置在cookie中的sessionI ...

  9. Flex 布局的各属性取值解释

    Flex布局是一种弹性布局.布局样式比较灵活,大多数情况下可以替代float,而且不会脱离文档里流. Flex中定义了两个轴线,一个主轴一个副轴,这个概念你可以想想屏幕坐标系(X轴向右,Y轴向下),F ...

  10. 类的成员变量修饰 const 和static

    类型 初始化方式 类内(声明) 类外(类实现文件) 构造函数中 构造函数的初始化列表 非静态非常量数据成员 N N Y Y 非静态常量数据成员 N N N Y (must) 静态非常量数据成员 N Y ...