专栏首页wfacebossjava中的排序(自定义数据排序)--使用Collections的sort方法

java中的排序(自定义数据排序)--使用Collections的sort方法

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

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. 排列:

  算法:如冒泡...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript组合设模式--改进上述引入的例子

    (5)客户端调用API,只需要简单的安排去上课即可,也就是客户端只需要写去上课的代码即可

    wfaceboss
  • JS控制文字只显示两行,超出部分显示省略号

    由于使用css控制文字只显示多行,超出部分显示省略号,存在一定的兼容性问题,所以总结了一下网上一些大咖使用js实现控制行数的解决方案。

    wfaceboss
  • 从视图到控制器的传值方法(表单)

    wfaceboss
  • 设计模式 开闭原则

    软件实体应该对扩展开放,对修改关闭,即实体应当通过扩展实现变化,而不是修改代码实现变化

    mySoul
  • 第3次文章:自定义类排序

    在现实生活中,我们需要对很多信息进行相应的排序,然后呈现给大家查看,有些数据是可以直接排序的,比如说我们最常见的数字,可以按照升序或者降序的方法来进行排列,又比...

    鹏-程-万-里
  • 首页JavaThymeleaf 模板引擎与Spring Boot

    1,Thymeleaf是什么 ? Thymeleaf 是一个Java类库,是一个xml/xhtml/html5的模板引擎,可以作为MVC的Web应用的Vie...

    cherishspring
  • 用Build来构建对象的写法 顶

    如果一个类的属性过多,用构造器来构建对象很难写,因此我们时用Build方式来构建对象。写法大致如下。

    算法之名
  • 通俗易懂PHP基础【9-类和对象(1)】

    曾经见过一个摄影师喂藏羚羊喝水,同行的警察把藏羚羊赶走了,摄影师问为什么,警察说,要不然它会以为人类是善良的。

    Lemon黄
  • 【译】用Java创建你的第一个区块链-part2:可交易

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    凯哥Java
  • IDEA 插件开发实战

    IntelliJ IDEA 是一款开发工具,提供很多插件功能,比如阿里规范插件(Alibaba Java Coding Guidelines),但是随着日常业务...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券