在进行对象数组排序的过程中需要使用到比较器,比较器有两个: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. C#模拟Http请求时出现 基础连接已经关闭 未能为 SSLTLS 安全通道建立信任关系

    //解决方法: //引入命名空间: using System.Security.Cryptography.X509Certificates; using System.Net.Security; // ...

  2. disabled="true" 的标签元素不可提交

    把jsp页面的input 标签设置成不可编辑: <input  name="Id"    value="${order.Id}" readOnly=&qu ...

  3. “三巨头”有变化,BAT还能走多久?

    在腾讯市值超越阿里巴巴后,市场分析多数认为,当年的BAT“三巨头”时代已经彻底结束,进入了“双寡头”时代了 从对外投资来看,BAT不同的投资逻辑可以推测其战略方向 撰文/梁云风 时评员,关注财经与互联 ...

  4. spring整合hibernate

    spring整合hibernate包括三部分:hibernate的配置.hibernate核心对象交给spring管理.事务由AOP控制 好处: 由java代码进行配置,摆脱硬编码,连接数据库等信息更 ...

  5. 【转】微信小程序给程序员带来的可能是一个赚钱的机遇

    自上周被微信小程序刷屏之后,这周大家都在谈微信小程序能够带来哪些红利的话题,其实我想从程序员的角度来谈谈,带给我们程序员来的红利,或许是我们程序员创业或者赚钱的机遇. 其实我从<作为移动开发程序 ...

  6. Nodejs与ES6系列3:generator对象

    3.generator对象 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.Generator的中文翻译是生成器,它是ECMAScript6(代号harmory) ...

  7. react引用ant的table组件

    import React from 'react';import '../../css/uicss/UI.css';import 'antd/lib/style/index.less';import ...

  8. AMD and CMD are dead之Why Namespace?

    缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...

  9. EF UoC

    The Repository Pattern with EF Code First & Dependency Injection in ASP.NET MVC3 Ray_Liang, 5 Ju ...

  10. IOS开发基础知识--碎片31

    1:UITableViewCell drawInRect 在iOS7中失败 解决办法,把Cell里的布局移到新建的View里面,在View里面实现DrawInRect,然后在Cell里面加载View, ...