在进行对象数组排序的过程中需要使用到比较器,比较器有两个: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. mybatis报错invalid types () or values ()解决方法

      原因: Pojo类User没提供无参数构造方法, 加上该构造方法后,问题解决 ### Cause: org.apache.ibatis.reflection.ReflectionException ...

  2. Asp.net mvc自定义Filter简单使用

    自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...

  3. entityframework学习笔记--002-database first

    1.实体框架紧紧地和Visual Studio集成在一起,为了在你的应用程序中使用实体框架,我们增加一个ADO.NET实体数据框架到你的项目.方法如下: 右键你的项目,然后选择 ➤New Item(新 ...

  4. Redis常用五大数据类型

    1.String(字符串) string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redis最基本的数据类型,一个red ...

  5. GJM :C#开发 异步处理是目的,多线程是手段

    但是BeginAccept和EndAccept不就是system.net.socket封装好的异步socket吗如果用多线程来实现的话那就不叫异步了吧 1.再次强调,异步是目的,多线程是手段. 所谓异 ...

  6. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  7. 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug

    前些日子不是在做 使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug.今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题. 首先先上图描 ...

  8. Jquery——简单的视差滚动效果,兼容PC移动端

    $(function(){     $(window).scroll(function(){         var top=$(this).scrollTop();        $(". ...

  9. Android 窗体设置

    requestWindowFeature(Window.FEATURE_NO_TITLE);  getWindow().setFlags(WindowManager.LayoutParams.FLAG ...

  10. 从英文变形规则计算到Restful Api设计

    ➠更多技术干货请戳:听云博客 一天在研究Restful API设计,命名的时候我总是很纠结,我相信大多数人也有这种感觉,不是说想不出来某个单词怎么写的问题,像我这种没事背单词背到13000词量的人也要 ...