前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中的排序(自定义数据排序)--使用Collections的sort方法

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

作者头像
wfaceboss
发布2019-04-08 10:27:08
4.2K0
发布2019-04-08 10:27:08
举报
文章被收录于专栏:wfacebosswfaceboss

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

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)新建一个实体类,如下

代码语言:javascript
复制
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接口),编写符合业务要求的排序方法,如下是按照价格排序的业务类(降序)

代码语言:javascript
复制
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)使用业务排序类

代码语言:javascript
复制
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,如下:

代码语言:javascript
复制
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,对该实体类的实例进行排序:

代码语言:javascript
复制
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. 排列:

  算法:如冒泡...

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档