使用Comparator实现自定义排序

下面给出一个例子详细讲解Comparator实现自定义排序

Comparator

1. 定义一个实体类Person

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
package map;

/** * Created by benjamin on 11/5/15. */public class Person {    String firstName,lastName;    char sex;    Integer age;

public Person(String firstName, String lastName, char sex, Integer age) {        this.firstName = firstName;        this.lastName = lastName;        this.sex = sex;        this.age = age;    }

public String getFirstName() {        return firstName;    }

public void setFirstName(String firstName) {        this.firstName = firstName;    }

public String getLastName() {        return lastName;    }

public void setLastName(String lastName) {        this.lastName = lastName;    }

public char getSex() {        return sex;    }

public void setSex(char sex) {        this.sex = sex;    }

public Integer getAge() {        return age;    }

public void setAge(Integer age) {        this.age = age;    }}

2. 比较器公共方法

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
package map;

/** * Created by benjamin on 11/5/15. */

import java.util.Comparator;

/** * 谁的拼音靠前,谁就排前面. * 然后对名字进行排序.如果同名,女性排前面. * 如果名字和性别都相同,年龄小的排前面. * * * int compare(Object o1, Object o2)返回一个基本的数据类型 * 如果要按照升序排序 * 则o1 < o2, return -1; equals return 0;  o1 > 02 return 1; * 如果要按照降序排序 * 则01 < 02, return 1;  equals return 0;  o1 > o2 return -1; * */public class Comparators {    /**     * 获取合适的比较器     * @return     */    public static Comparator getComparator() {        return new Comparator() {            @Override            public int compare(Object o1, Object o2) {                if(o1 instanceof String) {                    return compare((String)o1, (String)o2);                } else if(o1 instanceof Integer) {                    return compare((Integer)o1, (Integer)o2);                } else if(o1 instanceof Person) {                    return comparePerson((Person) o1, (Person) o2);                } else {                    System.out.println("未找到合适的比较器");                    return 1;                }            }        };    }

private static int compare(String o1, String o2) {        int len1 = o1.length();        int len2 = o2.length();        int min = Math.min(len1, len2);        char v1[] = o1.toCharArray();        char v2[] = o2.toCharArray();        int pos = 0;        //循环得到名字的排序        while(--min != 0) {            char c1 = v1[pos];            char c2 = v2[pos];            if (c1 != c2) {                return c1 - c2;            }            pos ++;        }        return len1 - len2;    }

/**     * 比较年龄     * @param o1     * @param o2     * @return     */    private static int compare(Integer o1, Integer o2) {        int val1 = o1.intValue();        int val2 = o2.intValue();        return val1 < val2 ? -1 : (val1 == val2 ? 0 : 1);    }

/**     * 比较性别     * @param o1     * @param o2     * @return     */    private static int compare(char o1, char o2) {        return ((o1 == o2) ? 0 : (o1 == '男' ? 1 : -1));    }

/**     * 比较Person     * @param o1     * @param o2     * @return     */    private static int comparePerson(Person o1, Person o2) {        String firstName1 = o1.getFirstName();        String firstName2 = o2.getFirstName();        String lastName1 = o1.getLastName();        String lastName2 = o2.getLastName();        char sex1 = o1.getSex();        char sex2 = o2.getSex();        Integer age1 = o1.getAge();        Integer age2 = o2.getAge();        return (compare(firstName1, firstName2) == 0 ?                (compare(lastName1, lastName2) == 0 ?                (compare(sex1, sex2) == 0 ?                (compare(age1, age2) == 0 ? 0 :                compare(age1, age2)) :                compare(sex1, sex2)) :                compare(lastName1, lastName2)) :                compare(firstName1, firstName2));    }

}

3. 测试排序

123456789101112131415161718192021222324252627
package map;

import java.util.Arrays;

/** * Created by benjamin on 11/5/15. */public class ComparatorsTest {    public static void main(String[] args) {        Person[] person = new Person[]{                new Person("ouyang", "feng", '男', new Integer(27)),                new Person("zhuang", "gw", '男', new Integer(27)),                new Person("deng", "jx", '男', new Integer(28)),                new Person("deng", "jx", '女', new Integer(27))        };

for (Person p : person) {            System.out.println("排序前=" + p.getFirstName() + " " + p.getLastName() + " " + p.getSex() + " " + p.getAge());        }        Arrays.sort(person, Comparators.getComparator());        System.out.println("----------------------------------------------------");

for (Person p : person) {            System.out.println("排序前=" + p.getFirstName() + " " + p.getLastName() + " " + p.getSex() + " " + p.getAge());        }    }}

4. 输出结果

12345678910
排序前=ouyang feng 男 27排序前=zhuang gw 男 27排序前=deng jx 男 28排序前=deng jx 女 27

----------------------------------------------------排序前=deng jx 女 27排序前=deng jx 男 28排序前=ouyang feng 男 27排序前=zhuang gw 男 27
时间: 2024-08-03 16:09:34

使用Comparator实现自定义排序的相关文章

Lucene5学习之自定义排序

         在Lucene5学习之排序-Sort中,我们已经学习了Sort的用法,已经了解了,Lucene搜索返回的命中结果默认是按照索引文档跟搜索关键字的相关度已经排序的,而相关度又是基于内部的打分机制和索引文档id,内部的打分机制则是根据Term的IDF-TF以及创建索引时Field的boost等决定的,默认是按照得分降序排序,得分相同再按docId升序排序.如果你觉得默认的排序方式满足不了你的需求,你可以设置SortField按照特定的域来排序,特定的域排序其实根据域的type类型去

Java集合框架实现自定义排序

Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优化. 1.使用Arrays对数组进行排序 Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法. (1)使用Arrays排序 Arrays使用非常简单,直接调用sort()即可: 1 2 3 4 5 6 7 8 9 10 11 int[] arr = new i

给WPS表格设置自定义排序

在使用wps处理数据的时候难免会遇到要使用排序的情况,而有些时候的排序又并不是单单的按照日期或者数字来排序,往往要根据实际的情况来进行排序工作,这使得的一些对排序功能不是特别了解的人来说无疑是一种痛苦,在这里我就教教大家怎么使用wps排序中的自定义排序哦首先呢我们举个栗子,以一个简单的表格为例 比如说我们希望以学历的高低来排序,那么我们首先要准备自定义的排序序列,以逗号隔开,要注意的是这里的逗号是英文输入法下的逗号哦,不要用中文输入法下的标点哦,把这个序列复制下来 然后我们要做的是点击wps左上

php 数组自定义排序:php二维数组自定义排序

<?php//对二维数组自定义排序function array_sort($arr,$keys,$type){$keysvalue=array();$i = 0;foreach($arr as $key=>$val) {$val[$keys] = str_replace("-","",$val[$keys]);$val[$keys] = str_replace(" ","",$val[$keys]);$val[$k

[开发故事]第三回,实现集合类Sort自定义排序

对集合元素进行排序是经常发生的事情,事实上大部分的集合类型都默认实现 了Sort方法,进行其元素的排序操作.例如List<T>集合的Sort方法有: public void Sort(); public void Sort(Comparison<T> comparison); public void Sort(IComparer<T> comparer); public void Sort(int index,int count,IComparer<T> c

自定义排序Excel数据的方法

  自定义排序Excel数据的方法         下面是一张按产品ID排序好了的表格,现在想要达到的目标是:将表格按照类别"海鲜,特制品,谷类/麦片,肉/家禽"序列依次排序. 1.选中要排序的表格中的某个单元格,切换到"数据"选项卡,在"排序和筛选"组中单击"排序"按钮. 2.在弹出的"排序"对话框中将主要关键字设置为"类别",然后单击"次序"下拉框右侧的按钮,选择

Excel表格中自定义排序序列的方法

   Excel表格中自定义排序序列的方法         1.启动Excel 2013并打开工作表,任意选取一个单元格后在"开始"选项卡的"编辑"组中单击"排序和筛选"按钮,在打开的下拉列表中选择"自定义排序"选项,如图1所示. 图1 选择"自定义排序"选项 2.打开"排序"对话框,在"次序"下拉列表中选择"自定义序列"选项,如图2所示. 图2

list泛型自定义排序示例

 这篇文章主要介绍了list泛型自定义排序示例,实现List泛型类将制定元素至前排序,大家参考使用吧 代码如下: static void Main(string[] args) {       Employee employee = new Employee();     //设置初始值     List<Employee> employeeList = new List<Employee>();     employeeList.Add(new Employee() { EmpI

Excel中自定义排序怎么使用

  Excel中自定义排序怎么使用?在工作中,有时我们需要在Excel中对数据进行快速排序,常用方法是选中要排序的区域,在菜单栏直接单击排序(升序或降序)即可;如果有时候这样操作不能满足你的需求,那么就需要自定义排序,具体方法如下: 步骤 打开Excel工作表,如图示: 选中要排序的区域. 打开自定义"排序"对话框. 操作过程如图. 说明:1.如果有多个条件,单击左上脚"添加条件".2.通过选项可以设置排序的方向和方法. 单击确定,得出如下结果. 以上就是在Exce