最近正好用到Comparator,发现能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序算法,用起来很方便,所以简单记录一下。

Interface Comparator

对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。

实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。具体看代码。

简单例子:

public class Test {

private final class CompareName implements Comparator {

boolean is_Ascend;

public CompareName(boolean b) {

// TODO Auto-generated constructor stub

is_Ascend = b;

}

@Override

public int compare(Milan o1, Milan o2) {

// TODO Auto-generated method stub

if (is_Ascend)

return o1.p_Name.compareTo(o2.p_Name);

else

return o2.p_Name.compareTo(o1.p_Name);

}

}

private final class CompareId implements Comparator {

boolean is_Ascend;

public CompareId(boolean b) {

// TODO Auto-generated constructor stub

is_Ascend = b;

}

@Override

public int compare(Milan o1, Milan o2) {

// TODO Auto-generated method stub

int a, b;

if (is_Ascend) {

a = o1.p_Id;

b = o2.p_Id;

} else {

a = o2.p_Id;

b = o1.p_Id;

}

if (a > b)

return 1;

else if (a == b)

return 0;

else

return -1;

}

}

public static void main(String[] args) {

Test t = new Test();

Milan p1 = new Milan(1, "Dida");

Milan p2 = new Milan(2, "Cafu");

Milan p3 = new Milan(3, "Maldini");

Milan P4 = new Milan(6, "Baresi");

Milan p5 = new Milan(9, "Inzaghi");

Milan P6 = new Milan(10, "Costa");

List mList = new ArrayList();

mList.add(p1);

mList.add(P6);

mList.add(P4);

mList.add(p2);

mList.add(p5);

mList.add(p3);

System.out.println("初始顺序");

System.out.println("姓名|号码");

for (Milan p : mList) {

System.out.println(p.p_Name + "|" + p.p_Id);

}

System.out.println();

System.out.println("对号码降序");

System.out.println("姓名|号码");

Collections.sort(mList, t.new CompareId(false));

for (Milan p : mList) {

System.out.println(p.p_Name + "|" + p.p_Id);

}

System.out.println();

System.out.println("对姓名升序");

System.out.println("姓名|号码");

Collections.sort(mList, t.new CompareName(true));

for (Milan p : mList) {

System.out.println(p.p_Name + "|" + p.p_Id);

}

}

}

输出结果:

初始顺序

姓名 | 号码

Dida | 1

Costa | 10

Baresi | 6

Cafu | 2

Inzaghi | 9

Maldini | 3

对号码降序

姓名 | 号码

Costa | 10

Inzaghi | 9

Baresi | 6

Maldini | 3

Cafu | 2

Dida | 1

对姓名升序

姓名 | 号码

Baresi | 6

Cafu | 2

Costa | 10

Dida | 1

Inzaghi | 9

Maldini | 3

sort方法第一个参数是一个list对象,排序结束后的结果就继续保存在这个list中,可以直接使用。

附上文档,不用再去查了

public interface Comparator

A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order. Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don't have a natural ordering.

The ordering imposed by a comparator c on a set of elements S is said to be consistent with equals if and only if c.compare(e1, e2)==0 has the same boolean value as e1.equals(e2) for every e1 and e2 in S.

Caution should be exercised when using a comparator capable of imposing an ordering inconsistent with equals to order a sorted set (or sorted map). Suppose a sorted set (or sorted map) with an explicit comparator c is used with elements (or keys) drawn from a set S. If the ordering imposed by c on S is inconsistent with equals, the sorted set (or sorted map) will behave "strangely." In particular the sorted set (or sorted map) will violate the general contract for set (or map), which is defined in terms of equals.

For example, suppose one adds two elements a and b such that (a.equals(b) && c.compare(a, b) != 0) to an empty TreeSet with comparator c. The second add operation will return true (and the size of the tree set will increase) because a and b are not equivalent from the tree set's perspective, even though this is contrary to the specification of the Set.add method.

Note: It is generally a good idea for comparators to also implement java.io.Serializable, as they may be used as ordering methods in serializable data structures (like TreeSet, TreeMap). In order for the data structure to serialize successfully, the comparator (if provided) must implement Serializable.

For the mathematically inclined, the relation that defines the imposed ordering that a given comparator c imposes on a given set of objects S is:

{(x, y) such that c.compare(x, y) <= 0}.

The quotient for this total order is:

{(x, y) such that c.compare(x, y) == 0}.

It follows immediately from the contract for compare that the quotient is an equivalence relation on S, and that the imposed ordering is a total order on S. When we say that the ordering imposed by c on S is consistent with equals, we mean that the quotient for the ordering is the equivalence relation defined by the objects' equals(Object) method(s):

{(x, y) such that x.equals(y)}.

Unlike Comparable, a comparator may optionally permit comparison of null arguments, while maintaining the requirements for an equivalence relation.

int compare(T o1, T o2)

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

In the foregoing description, the notation sgn(expression) designates the mathematical signum function, which is defined to return one of -1, 0, or 1 according to whether the value of expression is negative, zero or positive.

The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y. (This implies that compare(x, y) must throw an exception if and only if compare(y, x) throws an exception.)

The implementor must also ensure that the relation is transitive: ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.

Finally, the implementor must ensure that compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z.

It is generally the case, but not strictly required that (compare(x, y)==0) == (x.equals(y)). Generally speaking, any comparator that violates this condition should clearly indicate this fact. The recommended language is "Note: this comparator imposes orderings that are inconsistent with equals."

Parameters:

o1 - the first object to be compared.

o2 - the second object to be compared.

Returns:

a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

boolean equals(Object obj)

Indicates whether some other object is "equal to" this comparator. This method must obey the general contract of Object.equals(Object). Additionally, this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator. Thus, comp1.equals(comp2) implies that sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) for every object reference o1 and o2.

Note that it is always safe not to override Object.equals(Object). However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.

Overrides:

equals in class Object

Parameters:

obj - the reference object with which to compare.

Returns:

true only if the specified object is also a comparator and it imposes the same ordering as this comparator.

public static void sort(List list, Comparator super T> c)

Sorts the specified list according to the order induced by the specified comparator. All elements in the list must be mutually comparable using the specified comparator (that is, c.compare(e1, e2) must not throw a ClassCastException for any elements e1 and e2 in the list).

This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.

The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element in the low sublist is less than the lowest element in the high sublist). This algorithm offers guaranteed n log(n) performance. The specified list must be modifiable, but need not be resizable. This implementation dumps the specified list into an array, sorts the array, and iterates over the list resetting each element from the corresponding position in the array. This avoids the n2 log(n) performance that would result from attempting to sort a linked list in place.

Parameters:

list - the list to be sorted.

c - the comparator to determine the order of the list. A null value indicates that the elements' natural ordering should be used.

java 排序 comparator_[Java] 用 Comparator 实现排序相关推荐

  1. Comparator进行排序

    Java8 - 使用 Comparator.comparing 进行比较排序 使用外部比较器Comparator进行排序 当我们需要对集合的元素进行排序的时候,可以使用java.util.Compar ...

  2. java lambda sorted_Java8:Lambda表达式增强版Comparator和排序

    1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式--特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...

  3. Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击关注公众号,实用技术文章及时了解 来源:moonce.blog.csdn.net/article/ details/120324130 naturalOrder是比较器功能接口的静态方法. Jav ...

  4. Java 8 Comparator: 列表排序

    1.按字母顺序排序字符串列表 List<String> cities = Arrays.asList("Milan","london"," ...

  5. 【289期】Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... natur ...

  6. java 集合排序(Comparable、Comparator)

    一.java对集合排序的支持 java对集合的排序提供了两种方法. 1. Collections.sort(List list) ; 根据元素的自然顺序 对指定列表按升序进行排序. 2. Collec ...

  7. java 怎么自定义排序_Java如何实现List自定义排序

    Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...

  8. java字符排序规则_java 重写排序规则,用于代码层级排序

    1.dataList 是个List> 类型的数据,所以比较的时候是冲map中获取数据,并且数据不能为空. 2.dataList 类型是由自己定义的,new Comparator> 也是对应 ...

  9. 第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)

    试题 I: 双向排序 本题总分:25 分 [问题描述] 给定序列 (a1, a2, · · · , an) = (1, 2, · · · , n),即 ai = i. 小蓝将对这个序列进行 m 次操作 ...

最新文章

  1. 【转】oracle PLSQL基础学习
  2. 干货 | 加速AI发展!一文了解GPU Computing
  3. java程序不能编译_救命-JAVA程序不能编译!
  4. python环境管理命令_conda管理Python环境
  5. 第三方应用如何在SAP Kyma上进行服务注册
  6. [翻译]自定义Sharepoint的登陆页面
  7. Android 应用基础知识(6)---本地化
  8. update mysql php_PHP的MySQL的更新update
  9. 【老孙随笔】 神秘的茶馆
  10. Linux jar包 后台运行
  11. 按键精灵手机助手如何连接安卓版按键精灵如何连接手机助手
  12. 使用PGP加密你的文件
  13. 计算机word怎么插入图片,word如何插入图片 Word2003如何插入电脑中图片
  14. 【转】数据库一对一、一对多、多对多关系
  15. 尺度不变特征变换(SIFT算法…
  16. excel 职位分析
  17. UI设计师平时都用什么设计软件工具?
  18. 夜读 | 读书和不读书的人生,差别有多大
  19. 11 万字的字节码编程系列合集放送(ASM、Javassist、Byte-buddy、Javaagent)
  20. PNP与NPN两种三极管使用方法

热门文章

  1. 我和嵌入式的那些事儿
  2. php tp5什么是多模块,TP5单入口多域名多模块设置(各端分离)
  3. VMware 不可恢复错误(mks)解决方案
  4. 物联网:点燃JAVA未来之路的火炬
  5. 用英语卖二手计算机,二手交易市场大学英语作文带翻译
  6. Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?
  7. I/O 是什么意思?
  8. NO.87 提前还款or买火鸡?(捎带举例JAVA Double精度计算问题)
  9. java套接字通信_JAVA套接字实现简易的双人通信系统
  10. 走在上班的晨晖路上,想到了些人生感悟,采用一个中心两个基本点的描述方式