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
- Java 之集合排序
- Java排序之集合排序
- Java集合之排序探讨
- Java基础之常用集合及排序
- JAVA学习之集合排序,去重
- Java实训之集合排序
- Java集合框架之TreeMap的排序
- java集合框架之学生成绩排序
- Java-集合--Java集合排序
- 排序之set集合排序
- java中的集合排序
- Java集合对象排序
- Java集合对象排序
- java 集合排序
- Java集合对象排序
- Java排序算法集合
- Java集合对象排序
- Java集合对象排序
- JAVA求学之路第一天
- 递归大总结之指数运算
- BestCoder Round #74 (div.2)【1排列组合】
- java编程题:以三种不同方式输出九九乘法表(java)
- part5-2 基础DOM和CSS操作
- Java 之集合排序
- linux(ubuntu)安装PHP7以及memcache、redis等扩展
- [MMDxUE4]将MMD的模型和动作、相机文件导入UE4中使用
- usb 中传输类型
- MVP架构的简单实现
- 周期串(Periodic Strings,UVa455)
- 精进-如何成为一个高段位的学习者
- 第一章 第二篇
- 【PAT乙级题目1015】德才论