Java之——利用Comparator接口对多个排序条件进行处理

转载自:http://blog.csdn.net/l1028386804/article/details/56513205 

膜拜大神···

一、需求

    假设现在有个如此的需求:需要对一个这样的雇员列表进行排序,排序规则如下:
    1、首先级别最高的排在前面,
    2、如果级别相等,那么按工资排序,工资高的排在前面,
    3、如果工资相当则按入职年数排序,入职时间最长的排在前面。

雇员对象包含级别、工资和入职年份,代码如下:

 

[java] view plain copy
 
  1. package import /** 
  2.  * 雇员信息 
  3.  * @author liuyazhuang 
  4.  * 
  5.  */ publicclassimplements privatestaticfinallong      * ID 
  6.      */ publicint      * 级别 
  7.      */ publicint      * 工资 
  8.      */ publicint      * 入职年数 
  9.      */ publicint publicint return publicvoidint this publicint return publicvoidint this publicint return publicvoidint this publicint return publicvoidint this publicintintintint this this this this }  

 

二、实现Comparator接口

这里我们实现Java.util.Comparator接口,用于对雇员列表进行排序,代码如下:

[java] view plain copy
 
  1. package import import /** 
  2.  * 核心排序类 
  3.  * @author liuyazhuang 
  4.  * 
  5.  */ publicclassimplements   
  6. publicint int;  
  7.   
  8. int if) {  
  9. ) ?  : -;  
  10. else   
  11. if) {  
  12. ) ?  : -;  
  13. else   
  14. if) {  
  15. ) ?  : -;  
  16. return }  

 

三、验证排序结果

下面用一个单元测试,来验证排序结果是否正确

[java] view plain copy
 
  1. package import import import import import import /** 
  2.  * 测试排序类 
  3.  *  
  4.  * @author liuyazhuang 
  5.  * 
  6.  */ publicclass   
  7. publicvoidthrows new new));  
  8. new));  
  9. new));  
  10. new));  
  11. new));  
  12. new));  
  13. new));  
  14. new));  
  15. new));  
  16. new));  
  17. new));  
  18. new );  
  19. );  
  20. for , employee.getId(), employee.getLevel(), employee.getSalary(),  
  21. );  
  22. }  

运行结果:

 

四、附录

java.util.Comparator接口源代码

 

[java] view plain copy
 
  1. /* 
  2.  *  Licensed to the Apache Software Foundation (ASF) under one or more 
  3.  *  contributor license agreements.  See the NOTICE file distributed with 
  4.  *  this work for additional information regarding copyright ownership. 
  5.  *  The ASF licenses this file to You under the Apache License, Version 2.0 
  6.  *  (the "License"); you may not use this file except in compliance with 
  7.  *  the License.  You may obtain a copy of the License at 
  8.  * 
  9.  *     http://www.apache.org/licenses/LICENSE-2.0 
  10.  * 
  11.  *  Unless required by applicable law or agreed to in writing, software 
  12.  *  distributed under the License is distributed on an "AS IS" BASIS, 
  13.  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  14.  *  See the License for the specific language governing permissions and 
  15.  *  limitations under the License. 
  16.  */ package /** 
  17.  * A {@code Comparator} is used to compare two objects to determine their ordering with 
  18.  * respect to each other. On a given {@code Collection}, a {@code Comparator} can be used to 
  19.  * obtain a sorted {@code Collection} which is <i>totally ordered</i>. For a {@code Comparator} 
  20.  * to be <i>consistent with equals</i>, its {code #compare(Object, Object)} 
  21.  * method has to return zero for each pair of elements (a,b) where a.equals(b) 
  22.  * holds true. It is recommended that a {@code Comparator} implements 
  23.  * {@link java.io.Serializable}. 
  24.  * 
  25.  * @since 1.2 
  26.  */ publicinterface      * Compares the two specified objects to determine their relative ordering. The ordering 
  27.      * implied by the return value of this method for all possible pairs of 
  28.      * {@code (lhs, rhs)} should form an <i>equivalence relation</i>. 
  29.      * This means that 
  30.      * <ul> 
  31.      * <li>{@code compare(a,a)} returns zero for all {@code a}</li> 
  32.      * <li>the sign of {@code compare(a,b)} must be the opposite of the sign of {@code 
  33.      * compare(b,a)} for all pairs of (a,b)</li> 
  34.      * <li>From {@code compare(a,b) > 0} and {@code compare(b,c) > 0} it must 
  35.      * follow {@code compare(a,c) > 0} for all possible combinations of {@code 
  36.      * (a,b,c)}</li> 
  37.      * </ul> 
  38.      * 
  39.      * @param lhs 
  40.      *            an {@code Object}. 
  41.      * @param rhs 
  42.      *            a second {@code Object} to compare with {@code lhs}. 
  43.      * @return an integer < 0 if {@code lhs} is less than {@code rhs}, 0 if they are 
  44.      *         equal, and > 0 if {@code lhs} is greater than {@code rhs}. 
  45.      * @throws ClassCastException 
  46.      *                if objects are not of the correct type. 
  47.      */ publicint      * Compares this {@code Comparator} with the specified {@code Object} and indicates whether they 
  48.      * are equal. In order to be equal, {@code object} must represent the same object 
  49.      * as this instance using a class-specific comparison. 
  50.      * <p> 
  51.      * A {@code Comparator} never needs to override this method, but may choose so for 
  52.      * performance reasons. 
  53.      * 
  54.      * @param object 
  55.      *            the {@code Object} to compare with this comparator. 
  56.      * @return boolean {@code true} if specified {@code Object} is the same as this 
  57.      *         {@code Object}, and {@code false} otherwise. 
  58.      * @see Object#hashCode 
  59.      * @see Object#equals 
  60.      */ publicboolean }  
原文地址:https://www.cnblogs.com/Free-Thinker/p/10654436.html