在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator

①、java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个compareTo()方法用于大小比较

java规定:假如a和b是实现Comparable接口类创建的两个对象,

当a.compareTo(b)<0时,称a小于b;

a.compareTo(b)>0时,称a大于b;

a.compareTo(b)==0时,称a等于b。

②、java.util.Comparator:需要单独定义一个排序的比较规则类,里面有两个方法compare(),equals()

当对象刚开始时没有进行排序,但因后续要求需要进行排序时,为了不影响其他程序,可以使用此接口,新建一个专门用来对这个对象排序的类,这样对其他程序影响不大

优先使用Comparable

package com.wzy.main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet; import org.omg.PortableInterceptor.Interceptor;
//方式1. 在此类上直接实现Comparable接口
class People implements Comparable{
People(String name,int age){
this.name = name;
this.age = age;
}
private String name;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "name="+name+", age="+age;
}
@Override
public int compareTo(Object o) {
People p = (People)o;
return p.age-this.age;
}
} //方式2. 使用Comparator比较器
class PersonComparator implements Comparator {
@Override
public int compare(Object one, Object another) {
return ((People)one).getAge()-((People)another).getAge();
} }

public class Test01 {
public static void main(String[] args) {

List<People> list = new ArrayList<People>();
list.add(new People("aaa", 15));
list.add(new People("bbb", 10));
list.add(new People("ccc", 16));
list.add(new People("ddd", 13));
list.add(new People("eee", 19));

/*1 、使用Comparable,按照age来排*/
// Collections.sort(list);//1.1 传统实现方式,list的状态已经被改变为排序完的状态了
list.stream().sorted().forEach(System.out::println);//1.2 使用lambda表达式实现,没有改变list的状态

List l = Arrays.asList(list.stream().sorted().toArray());//直接把排序好的对象取出来

/*2 、使用Comparator比较器,按照age进行排序*/
// Collections.sort(list, new PersonComparator());//2.1 传统实现
// list.stream().sorted((one,another)->((People)one).getAge()-((People)another).getAge())
// .forEach(System.out::println); 2.2 lambda表达式实现

/**
* 建议使用lambda表达式,这样不会改变对象的状态
*
* */
Iterator<People> interceptor = list.iterator();
while(interceptor.hasNext()){
System.out.println(interceptor.next());
}

}
}

对象比较器:Comparable和Comparator的更多相关文章

  1. 比较器 comparable与comparator用法

    comparable 接口 Comparable<T> 类型参数:T - 可以与此对象进行比较的那些对象的类型 public interface Comparable<T> 此 ...

  2. 比较器Comparable和Comparator

    在java中要实现自定义类的比较,提供了以下两个接口: Comparable(内部排序) int compareTo(Object obj);返回值为int,默认升序排序 Comparator(外部排 ...

  3. Java的比较器Comparable与Comparator

    在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...

  4. 比较器comparable与comparator的使用

    在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...

  5. Java原来如此-比较器(Comparable、Comparator)

    有时候需要对Collection或者不为单一数字的Array进行比较,有两种方法,1是实现Comparable接口,2是实现Comparator接口. 1.ComParable接口 Comparabl ...

  6. 小白养成记——Java比较器Comparable和Comparator

    一.使用情景 1.  调用Arrays.sort()方法或Collections.sort()方法对自定义类的对象排序 以Arrays.sort()为例.假定有如下自定义的Person类 1 publ ...

  7. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  8. java对象比较器和克隆

    一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要 ...

  9. comparable和comparator

    Comparable Comparable可以认为是一个内部比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,在compareTo方法中指定具体的比较方法. comp ...

随机推荐

  1. jQuery data

    大家会如何设计一个缓存呢? 一个简单的Cache (function(){ var __cache = {}, Cache = { get: function(__name){ return __ca ...

  2. SQLServer并发问题,先SELECT后UPDATE,避免并发脏读情况解决

    在SQL Server中,需要对数据操作进行先SELECT 之后UPDATE,对于这样的操作,如果出现高并发,可能导致脏读情况的发生.不能保证数据的同步. 解决方案是在事物中对表进行加更新锁: 事务一 ...

  3. WEB前端--背景相关知识点总结

    一.背景(background) 它是单一属性 但是它衍生出很多的复合属性 background-color  背景色 background-image 背景图片 background-repeat ...

  4. 第一弹:Java 中创建对象的4种方式

    Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...

  5. 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    统一的IO接口 开发一套设备驱动同时具备串口和网络通讯能力,通讯接口在逻辑上是统一的,在此基础 ...

  6. [翻译]写给精明Java开发者的测试技巧

    我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从 “当然,但你知道怎样才能避免写测试吗?” 到 “必须的!我爱测试”都有.接下来我会给你几个小建议,它们可以让你编写测试变得 ...

  7. CSS、j's单行、多行文本溢出显示省略号

    在项目中,由于实际描述文字过多,导致初始页面纵向长度过长,也使得余下信息利用率降低:所以在文字过多的时候,初始化限制行数是有必要的 1. CSS单行文本溢出,显示省略号 <div style=& ...

  8. Bootstrap组件之响应式导航条

    响应式导航条:在PC和平板中默认要显示所有的内容:但在手机中导航条中默认只显示“LOGO/Brand”,以及一个“菜单折叠展开按钮”,只有单击折叠按钮后才显示所有的菜单项. 基础class: .nav ...

  9. 【再探backbone04】单页应用的基石-路由处理

    前言 首先发一点牢骚,互联网公司变化就是快,我去一个团队往往就一年时间该团队就得解散,这不,公司居然把无线团队解散了,我只能说,我那个去!!! 我去年还到处让人来呢,一个兴兴向荣的团队说没就没了啊!我 ...

  10. angularjs+微信,解决chooseImage不能预览的问题

    在wx.chooseImage的success回调中直接进行数据绑定,却在ng-repeat时发现ng-src不加载微信localId的问题,类似wxLocalResource://imageid98 ...