当我们排序的对象不止是简单的数据类型的时候
我们可以通过 实现Comparable 和Comparator 接口来完整对 对象的排序
Comparable和Compartor 的区别?
Comparable 是一个自身已经支持自比较的(如String ,Integer) 的接口
Comparator 可以说是一个 专用的比较器 当对象本身 不支持自排序和自比较函数的时候
我们可以通过实现Compartor 来比较两对象的大小
Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能
而 Comparator 可以看作一种算法 一种设计模式 (可以看作是一个策略模式 就是不改变对象自身,而用一个策略对象改变对象行为)
Comparable 相对比较固定 与具体类绑定 ,
Comparator 比较灵活 可以与任何需要实现功能的类 绑定
Comparable 可以说是 静态绑定
Comparator 可以说是动态绑定
Comparable
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与 e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也会抛出 NullPointerException。
强烈推荐(虽然不是必需的)使自然排序与 equals 一致。这是因为在使用其自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。
而 Comparator
比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,(compare((Object)e1, (Object)e2)==0) 与 e1.equals((Object)e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与等号一致 的排序。
当使用具有与等号一致的强行排序能力的 comparator 对有序 set(或有序映射)进行排序时,应该小心谨慎。假定一个带有显式 Comparator c 的有序 set(或有序映射)与从 set S 中抽取出来的元素(或键)一起使用。如果 c 强行对 S 进行的排序与等号一致,那么有序 set(或有序映射)将是行为“怪异的”。尤其是那些将违背根据 equals 所定义 set(或映射)的常规协定的有序 set(或有序映射)。
分享到:
相关推荐
在这个特定的教程“VS2008--利用委托给对象排序.rar”中,我们将探讨如何在C#编程中使用委托来实现对象的排序。委托在.NET中扮演着类似函数指针的角色,允许我们传递方法作为参数,从而实现更灵活的代码设计。 委托...
List对象排序通用方法List对象排序通用方法List对象排序通用方法List对象排序通用方法
2. **自定义排序**:如果需要根据属性值排序,可以传递一个比较函数给`sort()`方法: ```javascript let arr = [ {name: 'Tom', age: 25}, {name: 'Jerry', age: 20} ]; arr.sort((a, b) => a.age - b.age); ...
在编程领域,集合对象排序是一项基础且重要的任务,它涉及到数据结构和算法的知识。当我们处理包含多个元素的数据集,如数组、列表或集合时,排序能够帮助我们快速查找、分析和展示信息。本文将深入探讨如何对对象...
当我们说“arraylist对象中的某个值排序”时,这通常指的是对ArrayList中的元素,而不是ArrayList本身进行排序。ArrayList不支持直接排序,但是我们可以通过调用Collections.sort()方法或者自定义Comparator来实现。...
在处理包含多种类型对象的列表时,我们经常需要根据对象的某个或多个属性进行排序。这个过程称为多条件排序或多字段排序。本文将深入探讨如何在Java和Android环境中实现这个功能。 首先,让我们理解基础的排序方法...
这里我们探讨的主题是如何根据对象的属性进行排序,结合提供的`Simple.java`和`User.java`文件,我们可以假设这是一个关于自定义对象排序的例子。下面将详细解释相关知识点。 1. **Comparable接口**: Java中的`...
在Java编程语言中,对象排序是一项关键操作,特别是在处理集合数据结构时。本文将深入探讨如何对ArrayList、HashSet、TreeSet以及数组中的对象进行排序。理解这些排序机制对于编写高效且可维护的代码至关重要。 ...
面向对象排序实验主要探讨的是如何在编程中利用面向对象的思想实现不同的排序算法。这个实验源自山东大学的教学课程,目的是让学生深入理解面向对象编程的核心概念,并通过实现和比较各种排序算法来提升他们的编程...
本文将深入探讨如何在Java的List中对包含多个属性的对象进行排序,并且支持动态设置每个属性的排序方式。这个功能的实现是通过泛型和自定义比较器(Comparator)来完成的,对于复杂的数据排序需求具有很高的灵活性。...
按所推荐的程序在IE下跑了下,的确,排序耗时很小。 代码如下: [removed] /* * 洗牌 */ function getRandomPlayCard(m){ var array1=new Array(m); for(var i=0;i<m;i++){ var rnd=Math.floor(Math.random()*(i+0...
面向对象排序方法是一种在编程中实现排序算法时采用的基于面向对象编程思想的技术。面向对象编程(OOP)的核心概念包括封装、继承、多态和抽象。在这篇讨论中,我们将深入探讨如何利用这些概念来设计和实现排序算法...
面向对象实现队列的排序,包括排序的算法,用VC++面向对象实现,继承封装多态的基本用法
在Java编程语言中,对象排序是一项常见的操作,特别是在处理数据结构如数组或集合时。`java sort`标签表明我们关注的是使用Java内置的排序机制。本文将深入探讨Java中的对象排序,包括基本概念、API使用以及自定义...
本项目聚焦于面向对象编程中的一个重要应用——排序,通过设计一个程序包来实现多种排序算法,包括插入排序、冒泡排序和快速排序。下面我们将详细探讨这些排序算法。 1. **插入排序**: 插入排序是一种简单直观的...
在这个上下文中,我们将探讨如何运用面向对象思想来实现不同的排序算法,如快速排序、选择排序和冒泡排序,并考虑升序、降序以及字典排序的需求。 首先,**封装**是面向对象编程的基本原则之一,它意味着将数据和...
在Java编程中,对象数组排序是一项常见的任务,特别是在处理复杂数据结构时。当我们需要根据对象的多个属性进行排序时,情况会变得稍微复杂。本文将深入探讨如何在Java中实现这个功能,结合给出的标签“源码”和...
1.可以对任何简单类型和任意对象进行排序 2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法和顺序要求,保证其他程序不修改 4.减少程序代码中逻辑上的冗余 5.至少用两种方案编程实现该程序包,...
java中通过键盘输入来实例化类对象数组,同时对类对象排序,希望初学java的同学们可以下载下学习下