java学习-Comparable<Integer>接口方法的实现
基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,用于列表List或数组arrays的排序
Comparable<Integer>接口方法的实现,对象列表的升序降序接口
我们通过重写该接口方法,可以对列表进行升序或降序排列。
public int compareTo(T o);
This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.
此接口对实现它的每个类的对象强加一个默认排序。这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法。
Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort).
实现的这个接口的对象list列表或array数组可以使用sort方法让列表或数组的元素被自动排序
只需要实现compareTo()方法即可
public int compareTo(){}这个比较方法,,
如果要将对象列表进行升序排序,则第i个元素和第i+1元素 要满足a[i]>a[i+1] 返回1 a[i]<a[i+1] 返回-1 a[i]=a[i+1] 返回0
如果要将对象列表进行降序排序 要满足 a[i]>a[i+1] 返回-1 a[i]<a[i+1] 返回1 a[i]=a[i+1] 返回0
Collections.sort方法实现的就是按照此比较的东西排列
升序(从小到大):
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
}
降序(从大到小):
if(price < o.price){
return 1;
}
if(price > o.price){
return -1;
}

//将对象按价格进行升序排序
@Override
public int compareTo(flower o) {
//首先比较price,如果price相同返回0
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
} return 0;
}

为什么升序 返回值为1时,是n的值要大于n+1的值,而返回值为-1时n的值要小于n+1呢?
这个要查看源码才可以知道原理。(不好奇的可以不看哦^~^)
由于这个List.sort()这个排序方法时使用二分排序,源码如下,

while (left < right) {
int mid = (left + right) >>> 1;
if (pivot.compareTo(a[mid]) < 0)
right = mid;
else
left = mid + 1;
}

这个值是和已排序的数据的中间的数据进行比较,provot.compareTo(a[mid])
注意看,上面的a[mid]是作为比较方法的参数。
当小于0,也就是值为-1时,是我们要插入的数据作为调用方,
小于0时,该数据插入到前面,
大于0时,数据插入到后面
思维惯性以为升序就是第一个元素比第二个元素小。obj1.compareTo(Object obj2)
即obj1=2是第一个元素,obj2=8是第二个元素
那么我们升序时,如果obj1小于obj2,返回值为-1,则会将obj2插入到obj1前面,,排序前【2, 8】这样排序完后却变成了,,【8, 2】
这跟我们想要的升序数据不一样,
原因是java的二分法进行比较了是,,obj2.compareTo(obj1),,与我们想的刚好相反,
所以我们返回的值取反就可以变成升序了,
如这个消费类,,只给出部分代码

public class ConsumInfo implements Comparable<ConsumInfo> {
public double price;
public String name;
public Consuminfo(double price, String name){
this.price = price;
this.name = name;
}
@Override
public int compareTo(ConsumInfo o) {
//首先比较price,如果price相同
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
}
return 0;
}
}


ConsumInfo consumInfo1 = new ConsumInfo("consumInfo1", 400.0);
ConsumInfo consumInfo2 = new ConsumInfo("consumInfo2", 200.0);
List<ConsumInfo> list = new ArrayList<ConsumInfo>();
list.add(consumInfo1);
list.add(consumInfo2);
System.out.println("排序前:");
for(ConsumInfo consumInfo : list ){
System.out.println(consumInfo);
}
Collections.sort(list);//排序
System.out.println("排序后:");//排序后
for(ConsumInfo consumInfo :list){
System.out.println(consumInfo);
}

控制台输出信息为:
排序前:
ConsumInfo [name=consumInfo1, price=400.0]
ConsumInfo [name=consumInfo2, price=200.0]
排序后:
ConsumInfo [name=consumInfo2, price=200.0]
ConsumInfo [name=consumInfo1, price=400.0]
上面是最简单的两个元素进行排序,
第一次,往已排序列表中插入第一个元素,即数组中只有一个已排好序的元素,a[0] = consumInfo1
第二次时,left为0,right为1,进入while循环中,
mid=0,privot=consumInfo2
即consumInfo2.comparTo(a[0])
当方法的返回值小于0时,consumInfo2会插入在consumInfo1之前,
大于0时,会在consumInfo1之后
进行比较时,consumInfo2.price<consumInfo1.price 返回值小于0,也就是consumInfo1的值比较大,插入在1之前
java学习-Comparable<Integer>接口方法的实现的更多相关文章
- java集合的contains(obj)方法的实现
在实际项目中我们通常会有一个需求就是:想知道在一个列表中是否包含某一个对象 这里ArrayList表.HashSet表和HashMap表都提供了一个contains(obj)方法, 下面说一下两个列表 ...
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- java学习——JDK1.8接口和实现类
Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...
- Java学习:Set接口与HashSet集合存储数据的结构(哈希表)
Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...
- java学习面向对象之接口
上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...
- Java学习笔记_22_Set接口的实现类
22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不 ...
- java.lang.Comparable<T> 接口
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T ...
- java学习--抽象类与接口
一.抽象 在使用抽象类时需要注意几点: 1.抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可. 2.抽象方法必须由子类来进行重写. 3.只要包含一个抽象方法的抽象类,该方 ...
- Java学习(set接口、HashSet集合)
一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...
随机推荐
- Nodejs的测试和测试驱动开发
测试是保证软件质量必不可少的一环.测试有很多形式:手动.自动.单元测试等等.这里我们只聊使用Mocha这个框架在Nodejs中实现单元测试.单元测试是测试等重要组成,这样的测试只对于一个方法,这样的一 ...
- spark图解
导语 spark 已经成为广告.报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spa ...
- [violet2]sillyz
题意:定义S(n) = n*各数位之积,然后给定L<=R<=10^18,求有多少个n在[L,R]区间内 思路: 看了半天无从下手..看完题解才豁然开朗.. 具体思路看vani神博客吧.讲的 ...
- 用JavaScript写的动态表格
实现的功能有Table表格添加,删除.输入,删除的全选,单行删除. HTML代码部分 <body> <form> <table border="1" ...
- UNIGUI接收普通消息和被动回复用户消息
接收普通消息和被动回复用户消息 用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复 ...
- 分形之闵可夫斯基(Minkowski)
与上一篇文章分形之正方形折线相似,闵可夫斯基分形也是分形出正方体,不同之处是它分出了两个正方体. 核心代码: static void FractalMinkowski(const Vector3&am ...
- Python基础语法-内置数据结构之列表
列表的一些特点: 列表是最常用的线性数据结构 list是一系列元素的有序组合 list是可变的 列表的操作, 增:append.extend.insert 删:clear.pop.remove 改:r ...
- SignalR 设计理念(一)
SignalR 设计理念(一) 实现客户端和服务器端的实时通讯. 问题阐述 客户端提供的方法不确定! 客户端的方法参数不确定! 不同的名称和参数要分别调用指定的方法! 调用客户端方法时,忽略大小写! ...
- [宁波集训]0827Day1
1.\(CF771D\ Bear\ and\ Company\)(原题,比赛时改为多组数据) 一道毒瘤\(dp\)题,\(dp[i][j][k][0/1]\)表示有\(i\)个\(V\),有\(j\) ...
- GoLang学习之Golang数组
Go语言数组 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素( element),一个数组包含的元素个数被称为数组的长度.需 ...