Comparable接口作用

article/2025/9/5 0:48:21

 今天在开发中无意看到Integer包装类内部实现了Comparable接口,因此探查一下该接口作用:

查看API解释:

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

一、为什么需要实现这个接口呢?

首先看一下数据的例子:

String[] strArr = {"A","B","C","E","D"};
Arrays.sort(strArr);
for (String string : strArr) {System.out.print(string+";");
}

输出结果:

A;B;C;D;E;

从中我们可以看出sort方法对数据中的String字符串按照一定规则进行了排序,那为什么会排序呢?

查看String类我们可以看到:

public final class String
implements Serializable, Comparable, CharSequence{...}

它也实现了Comparable接口。里面实现了compareTo方法,所以按照某种规则能够进行排序。

如果数组中的对象不是String而是自定义的类型呢?

public class ComparableDemo{public static void main(String[] args) {Object[] objArray = {new Person(20,"jack"),new Person(17,"tom"),new Person(27,"aj")};for (Object object : objArray) {System.out.print(object.toString());}Arrays.sort(objArray);for (Object object : objArray) {System.out.print(object.toString());}}
}
public class Person {private Integer age;private String name;public Person(int age,String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + "]";}}

 

结果为:

Person [age=20, name=jack]Person [age=17, name=tom]Person [age=27, name=aj]
Exception in thread "main" java.lang.ClassCastException: interfacedemo.Person cannot be cast to java.lang.Comparableat java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)at java.util.ComparableTimSort.sort(Unknown Source)at java.util.ComparableTimSort.sort(Unknown Source)at java.util.Arrays.sort(Unknown Source)at interfacedemo.ComparableDemo.main(ComparableDemo.java:18)

可以看到不进行排序打印是正常的,但是排序时报错了。因为系统无法知道使用什么规则进行排序。

我们存入字符串排序成功是因为String类已经实现Comparable接口,因此想要实现自定义对象比较同样需要实现该接口,其中的比较方法规则由我们自己设定。

二、接口简介

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也将抛出 NullPointerException。

建议(虽然不是必需的)最好使自然排序与 equals 一致。这是因为在使用自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。

例如,如果将两个键 a 和 b 添加到没有使用显式比较器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那么第二个 add 操作将返回 false(有序集合的大小没有增加),因为从有序集合的角度来看,a 和 b 是相等的。

实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。

从数学上讲,定义给定类 C 上自然排序的关系式 如下:

      {(x, y)|x.compareTo(y) <= 0}。

整体排序的 是:

      {(x, y)|x.compareTo(y) == 0}。

它直接遵循 compareTo 的协定,商是 C 的 等价关系,自然排序是 C 的 整体排序。当说到类的自然排序 与 equals 一致 时,是指自然排序的商是由类的 equals(Object) 方法定义的等价关系。

    {(x, y)|x.equals(y)}。

此接口是 Java Collections Framework 的成员。

三、实现该接口

上面的例子进行修改,这里通过比较对象中的age属性进行排序

public class Person implements Comparable{private Integer age;private String name;public Person(int age,String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + "]";}//进行方法重写@Overridepublic int compareTo(Object o) {Person p = (Person)o;return this.age - p.age;}}

结果打印:

Person [age=20, name=jack]Person [age=17, name=tom]Person [age=27, name=aj]
Person [age=17, name=tom]Person [age=20, name=jack]Person [age=27, name=aj]

最后附上该方法API描述:

compareTo

int compareTo(T o)

比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

实现类必须确保对于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果 y.compareTo(x) 抛出一个异常,则 x.compareTo(y) 也要抛出一个异常。)

实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0。

最后,实现者必须确保 x.compareTo(y)==0 意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”

在前面的描述中,符号 sgn(expression) 指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -1、0 或 1 中的一个值。

 

参数:

o - 要比较的对象。

返回:

负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

抛出:

ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/pnWuKjKo.shtml

相关文章

java接口的作用是什么?接口的使用规范介绍

你知道java接口的作用有哪些吗&#xff1f;java接口的使用规范又是怎样的呢&#xff1f;有哪些是需要我们注意的?下面一起来详细的了解一下吧。 java接口的作用是什么&#xff1f; 一、接口的作用 首先&#xff0c;我们来谈论一下java接口的作用吧! 简单的来说&#xff0c…

接口的作用

今日内容&#xff1a;接口概述、接口定义、接口的用法、接口的继承、接口和抽象类的区别。 1.概述 接口定义了实现某种功能的规范&#xff0c;用来扩展类的功能。接口并不是类&#xff0c;编写接口的方式和类很相似&#xff0c;但是它们属于不同的概念。类描述对象的属性和方法…

Pregel Master

转载于:https://www.cnblogs.com/fanweisheng/p/11269479.html

Pregel Combiner

转载于:https://www.cnblogs.com/fanweisheng/p/11269462.html

Pregel Aggregator

转载于:https://www.cnblogs.com/fanweisheng/p/11269466.html

Pregel Worker

转载于:https://www.cnblogs.com/fanweisheng/p/11269474.html

图计算-Pregel-Hama

一.图计算简介 1.1 图计算是专门针对图结构数据的处理&#xff0e; 许多大数据都是以大规模图或网络的形式呈现&#xff1b;许多非图结构的大数据&#xff0c;也常常被转换为图模型后进行分析&#xff1b;图结构很好地表达了数据之间的关联性&#xff1b;关联性计算是大数据计…

分布式图处理系统--Pregel

介绍分布式图处理系统–Pregel以及其开源实现–Giraph 图数据处理简介 图数据的应用 图数据 数据本身以图的形式呈现 社交网络传染病传播途径交通路网 某些非图结构的数据&#xff0c;也可以转换为图模型后进行处理 网页链接机器学习训练数据 关联性分析 图数据结构表达了…

graphx中Pregel函数详解

1、PregelAPI 图本质上是一种递归的数据结构&#xff0c;其顶点的属性值依赖于其邻接顶点&#xff0c;而其邻接顶点属性又依赖于其邻接顶点&#xff0c;许多重要的图算法通过迭代计算每个顶点的属性直到到达定点条件&#xff0c;这些迭代的图算法被抽象成一系列图并行操作。 2、…

Pregel与图迭代

graphx是如何实现Pregel迭代操作&#xff0c;我们应该如何使用该模型。先看下pregel接口源码&#xff1a; 接口中各参数的含义已在图中进行注释&#xff0c;所以此处不再赘述。简单介绍下源码中的参数说明&#xff1a; 剖析 pregel模型提供了消息收集方向、迭代次数、初始化消…

Google图算法引擎Pregel介绍

参考文献点击打开链接 【前言&#xff1a;有一种说法[1]是Google的程序里面80%用的是MapReduce&#xff0c;20%用的是Pregel。今天就来介绍一下这个Pregel。想要深入研究的同志们&#xff0c;可以参考最新的SIGMOD 2010 ppt[2]。】 简介 Pregel是一个用于分布式图计算的计算…

图计算: 使用 Spark Graphx Pregel API 处理分层数据

今天&#xff0c;分布式计算引擎是许多分析、批处理和流应用程序的支柱。Spark提供了许多开箱即用的高级功能&#xff08;pivot、分析窗口函数等&#xff09;来转换数据。有时需要处理分层数据或执行分层计算。许多数据库供应商提供诸如“递归 CTE&#xff08;公用表达式&#…

pregel 与 spark graphX 的 pregel api

[原文](https://blog.csdn.net/u013468917/article/details/51199808)简介 在Hadoop兴起之后&#xff0c;google又发布了三篇研究论文&#xff0c;分别阐述了了Caffeine、Pregel、Dremel三种技术&#xff0c;这三种技术也被成为google的新“三驾马车”&#xff0c;其中的Pregel…

Pregel体系结构

在Pregel计算框架中&#xff0c;一个大型图会被划分成许多个分区&#xff0c;每个分区都包含了一部分顶点以及以其为起点的边 一个顶点应该被分配到哪个分区上&#xff0c;是由一个函数决定的&#xff0c;系统默认函数为hash(ID) mod N&#xff0c;其中&#xff0c;N为所有分区…

Spark GraphX 中的 pregel函数(转载)

文章目录 pregel函数源码 与 各个参数介绍&#xff1a;案例&#xff1a; 求顶点5 到 其他各顶点的 最短距离pregel原理分析 一篇关于 Spark GraphX 中 pregel函数 的笔记&#xff0c;通过一个小案例将pregel函数理解透彻。 pregel函数源码 与 各个参数介绍&#xff1a; def…

03 graphx 从 SSSP 来看 pregel

前言 呵呵 最近刚好有一些需要使用到 图的相关计算 然后 在其他文章中找到了一篇 关于最短路径的graphx计算的代码 spark graphx 最短路径及中间节点 呵呵 很久没有用这些东西了, 虽然只是简单的使用, 但是还是要 复习一下, 稍微理解一下 他的执行方式 pregel 相关论文 …

ArangoDB(四)Pregel

arango pregel.status()返回值 localhost:8529_system> pregel.status(1099521660554) {"state" : "done","gss" : 7,"totalRuntime" : 8.389497518539429,"aggregators" : {},"sendCount" : 392647,"re…

graphx中的pregel原理详解

优秀参考&#xff1a; graphx教程参考&#xff1a;https://www.jianshu.com/p/ad5cedc30ba4 pergel函数详细讲解&#xff1a;https://blog.csdn.net/hanweileilei/article/details/89764466 迪杰斯特拉原理简介&#xff1a;https://www.jianshu.com/p/ad5cedc30ba4 ps: 以最…

Pregel模型

简介 在Hadoop兴起之后&#xff0c;google又发布了三篇研究论文&#xff0c;分别阐述了了Caffeine、Pregel、Dremel三种技术&#xff0c;这三种技术也被成为google的新“三驾马车”&#xff0c;其中的Pregel是google提出的用于大规模分布式图计算框架。主要用于图遍历&#xf…

Spark Graphx Pregel(pregel参数详解,pregel调用实现过程的详细解释)

Spark Graphx Pregel 一.Pregel概述1.什么是pregel&#xff1f;2.pregel应用场景 二.Pregel源码及参数解释1.源码2.参数详细解释&#xff08;1&#xff09;initialMsg&#xff08;2&#xff09;maxIteration&#xff08;3&#xff09;activeDirection&#xff08;4&#xff09;…