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

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. OpenTSDB安装

    时序数据库 时序数据库全称为时间序列数据库.主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据.时间序列数据主要由电力行业.化工行业.物联网行业等各类 ...

  2. Excel导出文件流下载

    Controller.cs @CrossOrigin(allowCredentials="true", allowedHeaders="*", methods= ...

  3. 流媒体技术笔记(DarwinStreamingServer相关)

    简介 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写,在设计上遵循高性能,简单,模块化等程序设计原则,务求做 ...

  4. Hadoop概念学习系列之谈hadoop/spark里为什么都有,YARN呢?(四十一)

    在Hadoop集群里,有三种模式: 1.本地模式 2.伪分布模式 3.全分布模式 在Spark集群里,有四种模式: 1.local单机模式 结果xshell可见: ./bin/spark-submit ...

  5. java设计模式-Observe

    一.背景 请模拟下面情形: 小孩在睡觉,醒来后要求吃东西   代码: class Child{ private boolean wakenUp = false; void wakeUp(){ wake ...

  6. vue之文本渲染

    Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据.所有Vue的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析. 在前面,我们一直使用的是{ ...

  7. 科学-建筑学-事务所:KPF

    ylbtech-科学-建筑学-事务所:KPF 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://www.kpf.com/projects/na ...

  8. 廖雪峰Java1-3流程控制-5循环

    while循环 while循环首先判断条件: 条件满足时循环:条件不满足时退出循环 如果一开始条件就不满足,一次都不循环.如while false int sum = 0; int n = 1; wh ...

  9. idea关闭标签快捷键修改----兼 常用实用快捷键

    还有一个快捷键: 自动补全返回值 : ctrl + alt + v alt + enter: 自动添加未定义的方法 idea 原本的关闭快捷键是: ctrl + F4,但是不好用,谁的手指伸这么长 修 ...

  10. [UE4]认识CanvasPanelSlot,Construct Object From Class动态创建UI控件

    Canvas Panel Slot是UserWidget的Canvas Panel组件容器内的组件特有的属性. 只有放置在Canvas Panel容器内才会有Canvas Panel Slot属性 可 ...