Java 之集合排序

来源:互联网 发布:华山 险 知乎 编辑:程序博客网 时间:2024/06/04 20:01
  • 排序
  • Comparable接口
  • Comparator接口 排序器
  • 通用排序器

1. 排序

我们都知道,算法有各种各样的算法。排序算法通常使用的主要有九种。但是,我们排序的时候,如果自己实现算法的话就会非常麻烦,那么我们在工业界的代码应该如何书写的?Java内主要提供了Comparable接口和Comparator 接口。


2. Comparable接口

主要需要门重写Model对象中的compareTo(Object o)类。
举例说明如下所示:

package test;import java.util.Comparator;/** * 具体的比较类(比较器),实现Comparator接口 * @author breeze * */public class ComparatorConsunInfo implements Comparator<ConsumInfo> {    /**     * 顺序(从小到大):     * if(price < o.price){            return -1;        }        if(price > o.price){            return 1;        }     * 倒序(从大到小):     * if(price < o.price){            return 1;        }        if(price > o.price){            return -1;        }     */    @Override    public int compare(ConsumInfo o1, ConsumInfo o2) {         //首先比较price,如果price相同,则比较uid        if(o1.getPrice() > o2.getPrice()){            return 1;        }        if(o1.getPrice() < o2.getPrice()){            return -1;        }        if(o1.getPrice() == o2.getPrice()){            if(o1.getUid() > o2.getUid()){                return 1;            }            if(o1.getUid() < o2.getUid()){                return -1;            }        }        return 0;    }}/** * 需要进行比较的类 * @author breeze * */public class ConsumInfo{    private int uid;    private String name;    private double price;    private Date datetime;    public ConsumInfo() {        // TODO Auto-generated constructor stub    }    public ConsumInfo(int uid,String name,double price,Date datetime){        this.uid = uid;        this.name = name;        this.price = price;        this.datetime = datetime;    }    public int getUid() {        return uid;    }    public void setUid(int uid) {        this.uid = uid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public Date getDatetime() {        return datetime;    }    public void setDatetime(Date datetime) {        this.datetime = datetime;    }    @Override    public String toString() {        return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price                + ", datetime=" + datetime + "]";    }}//测试类public class ConsumInfoTest {    public static void main(String[] args) {        ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date());        ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date());        ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date());        ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date());        ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date());        ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date());        ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date());        ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date());        List<ConsumInfo> list = new ArrayList<ConsumInfo>();        list.add(consumInfo1);        list.add(consumInfo2);        list.add(consumInfo3);        list.add(consumInfo4);        list.add(consumInfo5);        list.add(consumInfo6);        list.add(consumInfo7);        list.add(consumInfo8);        System.out.println("排序前:");        //排序前        for(ConsumInfo consumInfo : list ){            System.out.println(consumInfo);        }        ComparatorConsunInfo comparatorConsunInfo = new ComparatorConsunInfo();//比较器        Collections.sort(list,comparatorConsunInfo);//排序        System.out.println("排序后:");        //排序后        for(ConsumInfo consumInfo :list){            System.out.println(consumInfo);        }    }}

3. Comparator接口

主要需要重写其中的compare(Object o1, Object o2)方法。

举例

package com.mxl.algorithlm;import java.util.Date;/** * 因为要实现对ConsumInfo对象的排序,所以在ConsunInfo类中要实现Comparable接口,也就是要实现compareTo()方法 * 具体的比较参照:依次按照price、uid进行倒序排序 * @author breeze * */public class ConsumInfo implements Comparable<ConsumInfo> {    private int uid;    private String name;    private double price;    private Date datetime;    public ConsumInfo() {        // TODO Auto-generated constructor stub    }    public ConsumInfo(int uid,String name,double price,Date datetime){        this.uid = uid;        this.name = name;        this.price = price;        this.datetime = datetime;    }    public int getUid() {        return uid;    }    public void setUid(int uid) {        this.uid = uid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public Date getDatetime() {        return datetime;    }    public void setDatetime(Date datetime) {        this.datetime = datetime;    }    @Override    public String toString() {        return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price                + ", datetime=" + datetime + "]";    }    /**     * 这里比较的是什么, Collections.sort方法实现的就是按照此比较的东西排列     * 顺序(从小到大):     * if(price < o.price){            return -1;        }        if(price > o.price){            return 1;        }     * 倒序(从大到小):     * if(price < o.price){            return 1;        }        if(price > o.price){            return -1;        }     *      */    @Override    public int compareTo(ConsumInfo o) {        //首先比较price,如果price相同,则比较uid        if(price < o.price){            return -1;        }        if(price > o.price){            return 1;        }        if(price == o.price){            if(uid < o.uid){                return -1;            }            if(uid > o.uid){                return 1;            }        }        return 0;    }}//测试类package com.mxl.algorithlm;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.List;public class ConsumInfoTest {    public static void main(String[] args) {        ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date());        ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date());        ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date());        ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date());        ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date());        ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date());        ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date());        ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date());        List<ConsumInfo> list = new ArrayList<ConsumInfo>();        list.add(consumInfo1);        list.add(consumInfo2);        list.add(consumInfo3);        list.add(consumInfo4);        list.add(consumInfo5);        list.add(consumInfo6);        list.add(consumInfo7);        list.add(consumInfo8);        System.out.println("排序前:");        //排序前        for(ConsumInfo consumInfo : list ){            System.out.println(consumInfo);        }        Collections.sort(list);//排序        System.out.println("排序后:");        //排序后        for(ConsumInfo consumInfo :list){            System.out.println(consumInfo);        }    }}

4. 通用性排序器

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Comparator;public class IdComparator<T> implements Comparator<T>{    private String attributeName;    public IdComparator(){    }    public IdComparator(String attributeName){        this.attributeName = attributeName;    }    public String getAttributeName() {        return attributeName;    }    public void setAttributeName(String attributeName) {        this.attributeName = attributeName;    }     /**       * 如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;       */    @Override    public int compare(T o1, T o2) {        try {            Class<? extends Object> tClass = o1.getClass();            Method method = tClass.getMethod(attributeName);            Class<?> returnType = method.getReturnType();            Object obj = returnType.newInstance();            obj.getClass().getName();            if (returnType.newInstance() instanceof Integer) {              // 可以替换为Number类            // 因为基本数据类型只有 Number类和 String类类型                Integer number1 = (Integer) method.invoke(o1);                Integer number2 = (Integer) method.invoke(o2);                if (number1 > number2) {                    return 1;                } else if (number1 < number2) {                        return -1;                } else {                        return 0;                }            }else if(returnType.newInstance() instanceof String){                String str1 = (String) method.invoke(o1);                String str2 = (String) method.invoke(o2);                if (str1.compareTo(str2) > 0) {                    return 1;                } else if (str1.compareTo(str2) < 0) {                        return -1;                } else {                        return 0;                }            }        } catch (Exception ex) {            ex.printStackTrace();        }        return -1;    }}

5. 参考文献

[1]. Java中实现对象的比较:Comparable接口和Comparator接口
[2]. 比较器:Compare接口与Comparator接口区别与理解

1 0
原创粉丝点击