排序:将一组数据按相应的规则 排列 顺序

1.规则:
      基本数据类型:日常的大小排序。
引用类型:
  1. 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可。----实现Comparable接口

    1. 整数、 Integer..:根据基本数据类型大小

    2. Character(字符):根据Unicode编码顺序

    3. String(字符串):

      1)如果其中一个是另一个起始开始的子串,返回长度之差,

      2)否则返回第一个不相等的Unicode之差。

    4. 日期:根据日期的长整型数比较。

  1. 自定义引用类型,需要按照业务规则排序。有两种方式,分别如下所述:
    当引用类型的内置排序方式无法满足需求时可以自己实现满足既定要求的排序,有两种方式:
    第一种: 自定义业务排序类:新建一个业务排序类实现java.util.Comparator 下的compare 接口,然后使用java提供的Collections调用排序方法,并将此业务排序类作为参数传递给Collections的sort方法,如下:
               (1)新建一个实体类,如下
package top.wfaceboss.sort.refType2;

public class Goods {
// 价格
private double price;
// 商品名称
private String name;
// 收藏量
private int fav; public Goods() {
} public Goods(String name,double price, int fav) {
super();
this.price = price;
this.name = name;
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;
} public int getFav() {
return fav;
} public void setFav(int fav) {
this.fav = fav;
} @Override
public String toString() {
return "商品名:" + this.name + ",收藏量:" + this.fav + ",价格:" + this.price + "\n";
} }

    (2)新建业务排序类(实现java.util.Comparator接口),编写符合业务要求的排序方法,如下是按照价格排序的业务类(降序)

package top.wfaceboss.sort.refType2;

/**
* 按照价格排序的业务类(降序)
*
* @author Administrator
*
*/
public class GoodsPriceCompare implements java.util.Comparator<Goods> { @Override
public int compare(Goods o1, Goods o2) { return -(o1.getPrice()-o2.getPrice()>0?1:o1.getPrice()==o2.getPrice()?0:-1);//降序
} }

    (3)使用业务排序类

package top.wfaceboss.sort.refType2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class GoodsApp {
public static void main(String[] args) {
List<Goods> list = new ArrayList<Goods>();
list.add(new Goods("老马视频", 100, 2000));
list.add(new Goods("老高视频", 50, 2000));
list.add(new Goods("老裴视频", 1000, 1000));
System.out.println("排序前:" + list);
Collections.sort(list,new GoodsPriceCompare());
System.out.println("排序后:"+list);
}
}
    第二种:实体类实现 java.lang.Comparable下的compareTo接口,在接口中实现满足需求的,然后使用java提供的Collections调用排序方法sort,会自动调用此时实现的接口方法。
             (1)新建一个实体类,实现java.lang.Comparable接口compareTo,如下:
package top.wfaceboss.sort.refType;

import java.text.SimpleDateFormat;
import java.util.Date; /**
* 新闻条目实体类 排序方式: java.lang.Comparable+compareTo
*
* @author Administrator
* @param <T>
*
*/
public class NewsItem implements java.lang.Comparable<NewsItem> {
// 标题
private String title;
// 点击量
private int hits;
// 时间
private Date pubTime; public int getHits() {
return hits;
} public void setHits(int hits) {
this.hits = hits;
} public NewsItem() { } public NewsItem(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 Date getPubTime() {
return pubTime;
} public void setPubTime(Date pubTime) {
this.pubTime = pubTime;
} // 时间降序+点击量升序+标题降序
@Override
public int compareTo(NewsItem o) {
System.out.println("============dd==========");
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;
} @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();
} }

    (2)使用java自带的Collections调用sort,对该实体类的实例进行排序:

package top.wfaceboss.sort.refType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List; /**
* 使用Collections
*
*/
public class NewsItemApp {
public static void main(String[] args) {
List<NewsItem> news = new ArrayList<NewsItem>();
news.add(new NewsItem("aaa", 50, new Date()));
news.add(new NewsItem("bbb", 60, new Date(System.currentTimeMillis() - 1000 * 60 * 60)));
news.add(new NewsItem("ccc", 30, new Date(System.currentTimeMillis() + 1000 * 60 * 60))); Collections.sort(news);
System.out.println(news);
}
}
2.顺序:
  升序:从小到大
  降序:从大到小
3. 排列:
  算法:如冒泡...

java中的排序(自定义数据排序)--使用Collections的sort方法的更多相关文章

  1. Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...

  2. JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson

    java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...

  3. Java中final修饰的数据

    目录 Java中final修饰的数据 有初始值的final域 final+基本数据类型 final+引用数据类型 final与static final 空白final域 final修饰的参数 基本数据 ...

  4. 怎么在java中创建一个自定义的collector

    目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的c ...

  5. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  6. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  7. java中多线程执行时,为何调用的是start()方法而不是run()方法

    Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...

  8. Java中list集合自定义排序-2022新项目

    一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...

  9. javascript中对两个对象进行排序 和 java中的两个对象排序

    javascript中的对象数组排序 一 定义一个对象数组 var text = [{"name":"张","age":24},{" ...

随机推荐

  1. django1.10.3下admin后台管理老是显示object

    在设置了一个新models phone book后,admin管理显示数据名称都是object 尝试为model重写__unicode__方法后无效,经查询,在py3环境中,需要重写__str__方法 ...

  2. linux svn客户端通过 https访问windows VisualSVN Server Manager

    1)需求: 已经在阿里云windwos系统 下面安装了VisualSVN Server Manager 做为svn服务器: 现在要在腾讯云源码安装新版本客户端 2)开始源码编译安装TortoiseSV ...

  3. OpenGL学习记录

    1.QT OpenGL工程建立: http://www.cnblogs.com/tornadomeet/archive/2012/08/22/2651574.html 2.Qt自定义界面类并提升(提升 ...

  4. vue项目中, 字段信息为空时不渲染,是真的不渲染吗

    代码 样式,宽度pro_proj 此class设置有宽度,考虑字数如果太多就进入下一行就没有设置高度 样式改为 数据 渲染. 开始以为,null时vue不渲染,然后审查元素,发现渲染的dom是存在的, ...

  5. 统计python文件中的代码,注释,空白对应的行数

    其实代码和空白行很好统计,难点是注释行 python中的注释分为以#开头的单行注释 或者以'''开头以'''结尾 或以"""开头以"""结尾 ...

  6. Hive深入学习--应用场景及架构原理

    Hive背景介绍 Hive最初是Facebook为了满足对海量社交网络数据的管理和机器学习的需求而产生和发展的.互联网现在进入了大数据时代,大数据是现在互联网的趋势,而hadoop就是大数据时代里的核 ...

  7. centos6.5制作OpenStack云平台Windows7镜像

    # yum install virt-manager libvirt qemu-img virt-viewer -y # vi /etc/libvirt/qemu.conf # service lib ...

  8. [UE4]用Blenspace混合空间动画代替AimOffset动画偏移

  9. 00010 - cut选取命令详解

    定义 正如其名,cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的 剪切依据 cut命令主要是接受三个定位方法: 第一,字节(by ...

  10. aspnet-api-versioning

    https://github.com/Microsoft/aspnet-api-versioning