java中的比较器有两种:

1、实体类实现Comparable接口,并实现其中的compareTo方法

2、在外部定义实现Comparator接口的比较器类,并实现其中的compare方法


Comparable接口

Person类源码:

package test;

public class Person implements Comparable<Person> {
private Integer id;
private String name;
private Integer age; public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
} @Override
public int compareTo(Person person) {
return name.compareTo(person.name);
} public String toString() {
return id + "\t" + name + "\t" + age;
} public int getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

按名字进行排序,测试代码:

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class ComparableTest { public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Person(1, "b", 13));
list.add(new Person(2, "d", 12));
list.add(new Person(3, "a", 12));
list.add(new Person(4, "a", 21));
Collections.sort(list);
System.out.println("编号\t姓名\t年龄");
for (Person p : list) {
System.out.println(p);
}
}
}

打印:

可以看出人员根据名字排序,当名字相等时,不做处理。

若要当名字相等时,年龄按从大到小排序,则修改Person类的compareTo方法,代码如下:

    public int compareTo(Person person) {
if (name.equals(person.name))
return (person.age).compareTo(age);
return name.compareTo(person.name);
}

打印:


Comparator接口

package test;

public class Person  {
private Integer id;
private String name;
private Integer age; public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
} public String toString() {
return id + "\t" + name + "\t" + age;
} public int getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

自定义比较器PersonComparator类,代码如下:

package test;

import java.util.Comparator;

public class PersonComparator implements Comparator<Person> {

    public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}

测试代码:

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class ComparatorTest {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Person(1, "b", 13));
list.add(new Person(2, "d", 12));
list.add(new Person(3, "a", 12));
list.add(new Person(4, "a", 21));
Collections.sort(list, new PersonComparator());
System.out.println("编号\t姓名\t年龄");
for (Person p : list) {
System.out.println(p);
}
}
}

打印:

java之比较器的更多相关文章

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

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

  2. java对象比较器和克隆

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

  3. java Comparable 比较器的使用

    /** * */ package com.mindreader; import java.util.Arrays; /** * @作者 Mind reader * @内容 对象数组排序——Compar ...

  4. Java对象比较器对泛型List进行排序-Demo

    针对形如:字段1 字段2 字段3 字段n 1 hello 26 7891 world 89 5562 what 55 4562 the 85 452 fuck 55 995 haha 98 455 以 ...

  5. Java基础--比较器Comparator

    Comparable接口和Comparator接口都是用来定义集合中的排序的,只是Comparable是在集合内部定义排序的实现,Comparator是在集合外部排序的实现. Comparable 的 ...

  6. Java 之 比较器( Comparator接口与 Comparable 接口)

    一.定制排序:java.util.Comparator 接口 强行对某个对象 collection 进行整体排序 的比较函数.可以将 Comparator 传递给 sort 方法(如 Collecti ...

  7. Java的比较器Comparable与Comparator

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

  8. Java——类比较器

    1.Product类 public class Product { private int pid; private String name; private double price; public ...

  9. Java自定义比较器Comparator

    1.数字排序  奇数在前,偶数在后.奇数降序,偶数升序.输入:"0,1,2,3,4,5,6,7,8,9"        输出:"9,7,5,3,1,0,2,4,6,8&q ...

随机推荐

  1. pycharm django使用技巧

  2. PAT(B) 1040 有几个PAT(Java)

    题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...

  3. 『Go基础』第5节 第一个Go程序

    本节我们来学习写一个最简单的Go程序: 打印 Hello Go. 第一个Go程序, 只要跟着做, 留下个印象就可以. 用Goland创建一个 hello_go.go 文件(后缀为 .go ). 文件内 ...

  4. quartz2.3.0(九)job任务监听器,监听任务执行前、后、取消手动处理方法

    job1任务类 package org.quartz.examples.example9; import java.util.Date; import org.quartz.Job; import o ...

  5. Java 平衡二叉树和AVL

      与BST<> 进行对比 import java.util.ArrayList; import java.util.Collections; public class Main { pu ...

  6. SpringBoot--对SpirngMVC的自动配置

    SpringBoot对SpringMVC提供了许多自动配置 Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver b ...

  7. 8 search中的timeout参数

    默认的search,是没有时间限制的.比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来.   然而,在某些场景下,客户是等不了10分钟的.比如,电商网站,客户宁可 ...

  8. Linux 基础学习1

    目录 Linux 基础学习 用户登录 终端 交互式接口 bash 修改ssh连接慢的步骤 命令提示符 显示提示符格式 命令 别名 命令格式 获取命令的帮助信息 man bash 快捷键 tab 键 引 ...

  9. 加标签的continue用法

    1.加标签的continue,类似于C语言的goto语句

  10. 【转】高性能网络编程2----TCP消息的发送

    在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字.操作TCP协议发送数据时,面对的是数据流.通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时, ...