java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

原文地址https://segmentfault.com/a/1190000005738975

 

实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 java.util.Comparator(接口) + compare(重写方法).

这两个接口我们非常的熟悉,但是 在用的时候会有一些不知道怎么下手的感觉,现在用案例进行总结,消除对这个知识点的理解盲区(个人的理解,如果有错误 请多多指教)。
一,在实际的需求中,我们需要根据对象的各种属性(标题,时间,点击率,销售额...)进行排序(升序,降序),可以在数据库的sql上进行处理,但是 不是每一个场景 都适合在sql上进行处理,我们有时候需要在程序根据不同的属性,对一个对象进行各种排序 通过页面呈现给用户。
下面有这样的一个需求,一种商品(商品名,销售量,生产日期),根据生产日期降序 销售量升序 商品名称降序

思路:首先按照日期降序,如果日期相同 按照销售量升序,如果销售量相同,按周商品的名称降序
1,创建需要比较的对象的java bean
创建 Bean的快捷键:
1),带参数的构造器:// Shift + Alt + S -->O
2),不带参数的构造器: //Alt + / 生成空的构造方法
3),生成 get set方法:// Shift + Alt + S --> R + Table + Enter + Shift +Table -->Enter

/*** 商品po类*/
public class Items implements java.lang.Comparable<Items> {private String title;private int hits;private Date pubTime;public Items() {}public Items(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;}//时间降序 点击量升序 标题降序
    @Overridepublic int compareTo(Items o) {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;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("商品名称").append(this.title);sb.append("销售量").append(this.hits);sb.append("生产时间").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).append("\n");return sb.toString();}}

 

2,造数据,比较

    //时间降序, 销售量升序, 标题降序
public static void main(String[] args) {List<Items> item = new ArrayList<Items>();item.add(new Items("abcitems",30,new Date(System.currentTimeMillis()-1000*60*60)));item.add(new Items("abcfgitems",30,new Date(System.currentTimeMillis()-1000*60*50)));item.add(new Items("abcditems",100,new Date()));item.add(new Items("abefNews",50,new Date(System.currentTimeMillis()-1000*60*60)));System.out.println("----------排序前----------");System.out.println(item);System.out.println("----------排序后----------");Collections.sort(item);System.out.println(item);
}

 

二,Comparator的应用场景
一般比较字符串是按照unicode的大小进行排序的,但是我需要按照字符串的长度进行排序,下面是实现的案例:
首先,定义比较的业务规则

/*** 定义业务的比较规则,我需要按照字符串的长度进行比较(在实际的场景中,可以根据业务的需求,灵活的改变比较规则,实现排序)*/
public class CompareString implements java.util.Comparator<String> {@Overridepublic int compare(String o1, String o2) {int len1 = o1.length();int len2 = o2.length();return -(len1-len2);//需要按照降序排列
    }
}

 

比较 字符串的长度,按照 降序排列

    public static void main(String[] args) {List<String>  list = new ArrayList<String>();list.add("abc");list.add("abcd");list.add("ab");list.add("abd");Collections.sort(list,new CompareString());System.out.println(list);//[abcd, abc, abd, ab]}

 

比如 商品,我需要按照价格的降序排列,代码如下:
商品 po类

/*** 商品po类*/
public class Products {private String title;private int price;public Products() {}public Products(String title, int price) {super();this.title = title;this.price = price;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}@Overridepublic String toString() {return "title=" + title+",price=" + price  +"\n";}
}

 

定义比较规则:

/*** 按照价格的降序排列*/public class ProductCompare implements java.util.Comparator<Products> {@Overridepublic int compare(Products o1, Products o2) {return -( o1.getPrice()-o2.getPrice()>0?1: (o1.getPrice()==o2.getPrice()?0:-1));}}

 

数据比较:

public static void main(String[] args) {List<Products> product = new ArrayList<Products>();product.add(new Products("a",120));product.add(new Products("b",143432));product.add(new Products("c",1892));product.add(new Products("d",11092));Collections.sort(product,new ProductCompare());System.out.println(product);结果:[title=b,price=143432title=d,price=11092title=c,price=1892title=a,price=120]}

 

转载于:https://www.cnblogs.com/111testing/p/9158140.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 4714 树+DFS

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4714 本来想直接求树的直径&#xff0c;再得出答案&#xff0c;后来发现是错的。 思路&#xff1a;任选一个点进行DFS&#xff0c;对于一棵以点u为根节点的子树来说&#xff0c;如果它的分支数大于1&#xff0c…

springboot----shiro集成

springboot中集成shiro相对简单&#xff0c;只需要两个类&#xff1a;一个是shiroConfig类&#xff0c;一个是CustonRealm类。 ShiroConfig类&#xff1a; 顾名思义就是对shiro的一些配置&#xff0c;相对于之前的xml配置。包括&#xff1a;过滤的文件和权限&#xff0c;密码加…

[pytorch、学习] - 5.3 多输入通道和多输出通道

参考 5.3 多输入通道和多输出通道 前面两节里我们用到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是h和w(像素),那么它可以表示为一个3 * h * w的多维数组。我们将大小为3…

非阻塞算法简介

在不只一个线程访问一个互斥的变量时&#xff0c;所有线程都必须使用同步&#xff0c;否则就可能会发生一些非常糟糕的事情。Java 语言中主要的同步手段就是 synchronized 关键字&#xff08;也称为内在锁&#xff09;&#xff0c;它强制实行互斥&#xff0c;确保执行 synchron…

springboot---成员初始化顺序

如果我们的类有如下成员变量&#xff1a; Component public class A {Autowiredpublic B b; // B is a beanpublic static C c; // C is also a beanpublic static int count;public float version;public A() {System.out.println("This is A constructor.");}Au…

[pytorch、学习] - 5.4 池化层

参考 5.4 池化层 在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。 5.4.1 二维最大池化层和平均池化层 池化层直接计算池化窗口内元素的最大值或者平均值。该运算也叫做最大池化层或平均池化层。 下面把池化层的前向计算实现在pool2d函数里…

mac上安装Chromedriver注意事宜

mac上安装Chromedriver注意事宜&#xff1a; 1.网上下载chromedriver文件或在百度网盘找chromedirver文件 2.将 chromedriver 放置到&#xff1a;/usr/local/bin/&#xff0c;操作如下&#xff1a; 打开Mac终端terminal : 进入 chromedirve文件所在目录&#xff0c;输入命令: s…

freemarker教程

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1.文本:直接输出的部分 2.注释:<#-- … -->格式部分,不会输出 3.插值:即${…}或#{…}格式的部分,将使用数据模型中的部分替代输出 4.FTL指令:FreeMarker指定,和HTML标记类似,名字前…

[pytorch、学习] - 5.5 卷积神经网络(LeNet)

参考 5.5 卷积神经网络&#xff08;LeNet&#xff09; 卷积层尝试解决两个问题: 卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别;卷积层通过滑动窗口将同一卷积核和不同位置的输入重复计算,从而避免参数尺寸过大。 5.5.1 LeNet模型 LeNet分为…

Android内存管理机制

好文摘录 原作&#xff1a; https://www.cnblogs.com/nathan909/p/5372981.html 1、基于Linux内存管理 Android系统是基于Linux 2.6内核开发的开源操作系统&#xff0c;而linux系统的内存管理有其独特的动态存储管理机制。不过Android系统对Linux的内存管理机制进行了优化&…

【Ruby】Ruby 类案例

阅读目录 Ruby类案例保存并执行代码Ruby类案例 下面将创建一个名为 Customer 的 Ruby 类&#xff0c;声明两个方法&#xff1a; display_details&#xff1a;该方法用于显示客户的详细信息。total_no_of_customers&#xff1a;该方法用于显示在系统中创建的客户总数量。实例 #!…

[pytorch、学习] - 5.6 深度卷积神经网络(AlexNet)

参考 5.6 深度卷积神经网络&#xff08;AlexNet&#xff09; 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪…

Springboot---Model,ModelMap,ModelAndView

Model&#xff08;org.springframework.ui.Model&#xff09; Model是一个接口&#xff0c;包含addAttribute方法&#xff0c;其实现类是ExtendedModelMap。 ExtendedModelMap继承了ModelMap类&#xff0c;ModelMap类实现了Map接口。 public class ExtendedModelMap extends M…

东南亚支付——柬埔寨行

考察时间&#xff1a;2018.5.28 至 2018.6.6 为了解柬埔寨大概国情和市场&#xff0c;在柬埔寨开展了为期近10天的工作。 观察了交通情况&#xff0c;周边街道的店面与商品&#xff0c;摊贩等&#xff0c;也走访了大学校区&#xff0c;看了永旺商超、本地超市和中国超市&#x…

Puzzle (II) UVA - 519

题目链接&#xff1a; https://vjudge.net/problem/UVA-519 思路&#xff1a; 剪枝回溯 这个题巧妙的是他按照表格的位置开始搜索&#xff0c;也就是说表格是定的&#xff0c;他不断用已有的图片从(0,0)开始拼到(n-1,m-1) 剪枝的地方&#xff1a; 1.由于含F的面只能拼到边上&am…

[pytorch、学习] - 5.7 使用重复元素的网络(VGG)

参考 5.7 使用重复元素的网络&#xff08;VGG&#xff09; AlexNet在LeNet的基础上增加了3个卷积层。但AlexNet作者对它们的卷积窗口、输出通道数和构造顺序均做了大量的调整。虽然AlexNet指明了深度卷积神经网络可以取得出色的结果&#xff0c;但并没有提供简单的规则以指导…

springboot---mybits整合

配置 POM文件 <parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath /> </parent><properties><proj…

使用airdrop进行文件共享

使用airdrop进行文件共享 学习了&#xff1a; https://support.apple.com/zh-cn/HT203106 https://zh.wikihow.com/%E5%9C%A8Mac%E4%B8%8A%E7%94%A8%E8%BF%91%E6%9C%BA%E6%8D%B7%E4%BC%A0%EF%BC%88Airdrop%EF%BC%89%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 转载于:https://www.cn…

【链表】逆序打印链表

1 public class Main {2 3 // 逆序打印链表4 public void reversePrint(Node node) {5 if (node null){6 return;7 }8 reversePrint(node.next);9 System.out.println(node.data); 10 } 11 12 public Node crea…

[pytorch、学习] - 5.8 网络中的网络(NiN)

参考 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的模块充分抽取空间特征&#xff0c;再以由全连接层构成的模块来输出分类结果。其中&#xff0c;AlexNet和VGG对LeNet的改进主要在于如何…