java对象比较排序

参考:改善java代码的151个建议-73建议:使用Compatator排序

在java中,要给数据排序,有两种实现方式:

  1. 实现Comparable接口
  2. 实现Comparator接口

  在JDK类库中,有一部分类实现了Comparable接口,如Integer Double和String等。 
 Comparable接口有一个comparTo(Object o)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,则表示x和y相等,如果返回值大于0,则表示x大于y,如果返回值小于0,则表示x小于y.

查看Comparable接口源码

public interface Comparable<T> {
    public int compareTo(T o);
}

举个例子:

给公司职员排序,按照工号排序,先定义一个职员类

编写Employee类实现Comparable接口

package hello;

import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;

public class Employee implements Comparable<Employee>{
    //id是根据进入公司的先后顺序编码的
    private int id;
    //姓名
    private String name;
    //职位
    private Position position;
    public Employee(int id, String name, Position position) {
        super();
        this.id = id;
        this.name = name;
        this.position = position;
    }
    //按照id号排序,也就是资历的深浅排序
    @Override
    public int compareTo(Employee o) {
        // TODO Auto-generated method stub
        return new CompareToBuilder().append(id, o.id).toComparison();
    }
    @Override
    public String toString(){
         return ToStringBuilder.reflectionToString(this);
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Position getPosition() {
        return position;
    }

    public void setPosition(Position position) {
        this.position = position;
    }

}

这是一个简单的javabean,描述的是一个员工的基本信息,其中id是员工编号,按照进入公司的先后顺序编码,position是岗位描述,表示是经理还是普通职员,这是一个枚举类型:

public enum Position {
  Boss, Manager,staff
}

职位有三个级别:

 Boss(老板), Manager(经理), Staff(职员)

  • 按id排序

Employee类的compareTo()方法,是Comparable接口必须要实现的方法,使用apach的工具类来实现,表明是按照id的自然序列排序的(升序)。一切准备完毕,我们看看如何排序:

package hello;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class HelloWord {

    public static void main(String[] args) {
        List<Employee> list = new ArrayList<Employee>(5);
        // 一个老板
        list.add(new Employee(1001, "张三", Position.Boss));
        // 两个经理
        list.add(new Employee(1006, "赵四", Position.Manager));
        list.add(new Employee(1003, "王五", Position.Manager));
        // 两个职员
        list.add(new Employee(10002, "李六", Position.staff));
        list.add(new Employee(1005, "马牛", Position.staff));
        // 按照id排序,也就是按照资历深浅排序
        Collections.sort(list);
        for (Employee e : list) {
            System.out.println(e);
        }
    }
}

【运行结果】:

[email protected][id=1001,name=张三,position=Boss]
[email protected][id=1003,name=王五,position=Manager]
[email protected][id=1005,name=马牛,position=staff]
[email protected][id=1006,name=赵四,position=Manager]
[email protected][id=10002,name=李六,position=staff]

是按照id升序排列的,结果正确。

  • 按职位排序

本着“领导为先”的理念,按职位从高到低排序,先是老板,然后是经理,最后是普通职员,Employee已经是一个稳定类,为了一个排序功能修改它,影响按照id排序,不是一个好办法。

Collections.sort()方法有一个重载方法sort(List<T> list, Comparator<? super T> c),有一个Comparator接口参数,我们实现这个接口:

//职位排序器
class PositionComparator implements Comparator<Employee>{
    @Override
    public int compare(Employee o1, Employee o2) {
        //按照职位降序排列
        return o1.getPosition().compareTo(o2.getPosition());
    }

创建了一个职位排序法,按职位高低排序,测试一下:

        Collections.sort(list, new PositionComparator());
        for (Employee e : list) {
            System.out.println(e);
        }

【运行结果】:

[email protected][id=1001,name=张三,position=Boss]
[email protected][id=1003,name=王五,position=Manager]
[email protected][id=1006,name=赵四,position=Manager]
[email protected][id=1005,name=马牛,position=staff]
[email protected][id=10002,name=李六,position=staff]

按照职位排序,结果正确。

  • 按照职位从低到高排序

为了照顾员工,需要按职位由低到高排序

两个办法:

  1. Collections.reverse(List<?> list)方法实现倒序排列
  2. Collections.sort(List<?> list,Collections.reverseOrder(new PositionComparator())也可以

用这两个方法来测试:

        Collections.reverse(list);
        for (Employee e : list) {
            System.out.println(e);
        }

        System.out.println("----");
        Collections.sort(list,
                Collections.reverseOrder(new PositionComparator()));
        for (Employee e : list) {
            System.out.println(e);
        }

【运行结果】:

[email protected][id=10002,name=李六,position=staff]
[email protected][id=1005,name=马牛,position=staff]
[email protected][id=1006,name=赵四,position=Manager]
[email protected][id=1003,name=王五,position=Manager]
[email protected][id=1001,name=张三,position=Boss]
----
[email protected][id=10002,name=李六,position=staff]
[email protected][id=1005,name=马牛,position=staff]
[email protected][id=1006,name=赵四,position=Manager]
[email protected][id=1003,name=王五,position=Manager]
[email protected][id=1001,name=张三,position=Boss]

按照职位由地到高排序,结果正确

  • 先按职位排序,职位 相同按id排序

在compareTo或compare方法中先判断职位是否相等,职位相等再根据工号排序

修改Employee类的compareTo()方法为

    @Override
    public int compareTo(Employee o) {
        return new CompareToBuilder()
            .append(position, o.position)    //按照职位排序
            .append(o.id,id).toComparison(); //工号排序
    }

排序代码:

        Collections.sort(list);
        for (Employee e : list) {
            System.out.println(e);
        }

【运行结果】:

[email protected][id=1001,name=张三,position=Boss]
[email protected][id=1006,name=赵四,position=Manager]
[email protected][id=1003,name=王五,position=Manager]
[email protected][id=1005,name=马牛,position=staff]
[email protected][id=1002,name=李六,position=staff]

总结:

  1. 实现了Comparable接口类表明自身可比较,有了比较才能进行排序;
  2. Comparator接口是一个工具类接口,用作比较,与原类的逻辑没有关系;
时间: 2024-10-24 03:17:02

java对象比较排序的相关文章

利用Apache的commons-beanutils和commons-collections包实现Java对象的按属性排序

在日常工作中经常用到需要对java对象集合或者Map集合中的某个属性做排序,这个需求可以利用Apache的commons-beanutils和commons-collections包来实现,主要实现方式如下: public static <T> void sort(List<T> list, String property, boolean asc) { Comparator<?> comparator = ComparableComparator.getInstanc

Java:List集合内的对象进行排序

List集合中的对象进行排序,除了for外,还有java的Collections对象来对摸个集合进行排序的用法. 比如说我有一个List集合,集合元素为: public class TaskAutoExecutePlan{ private String id = null; private AutoExecutePlanType autoExecutePlanType; private TaskStatus taskStatus; private String parameters; priva

Java对数组对象进行排序

下面是一组对数组对象进行排序的代码: package com.sun; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test09 { /** * @param args */ public static void main(String[] arg

Java对List对象进行排序

有时候需要对List对象进行排序,如果每一处都去写一个排序方法,就会产生重复代码的坏味道,而且每一处都写,工作量会很大.我们知道,Java提供了一个Collections.sort()方法可以对List排序,利用Java反射机制,很容易就能写出一个通用的排序方法. 为了防止出现不按照getter,setter规范命名的POJO类,我不打算动态调用getXXX()方法,而是直接获取对象的属性值.为了达到不论是否是public成员变量,都能获取到的目的,在获取到Field后,调用了setAccess

Java对象排序小测试

import java.util.ArrayList; import java.util.Collections; import java.util.List; /**  * Java对象排序  */ public class User implements Comparable<User> {     private int idx;     public User(int idx) {         this.idx = idx;     }     public int getIdx(

java对象比较器和克隆

一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要使用到.那么String类和自定义类能不能使用Arrays.sort()来进行排序呢.下面我们来试试,如下: Java代码 publicclassMystring { publicstaticvoidmain(String[] args) { String []a={"早上","

【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto()这四个方法,对于刚刚接触java的初学者来说,对于这块可以没有更深入的了解,只是单纯意义上的复制粘贴,并没有很好的去了解.现在借用这个时间给大家说说这几个方法作用. equals: 比较两个对象相等时使用(需要配合Hashcode一起使用,在后边再进行详细解释)   hashcode: 重写has

【转载】Java集合类的排序,查找,替换操作

转自:http://blog.csdn.net/sunhuaqiang1/article/details/52142873 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对象后,我们可以根据Collection中的方法进行排序,查找,替换操作.而不用在东奔西走的利用什么各种排序算法.正则来实现了.在进行数组排序时,有时反而会因为参数问题而大费周折.例如,自己在利用快排进行数组排序时,当将参数(int []

XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换

(六)使用JAXB进行java对象和xml格式之间的相互转换 JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类. JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树