在Java中(默认Java8),假设有一个类定义为:
java">class Pair{int a,b;
}
现在有一个Pair
列表pairs
,其类型为ArrayList<Pair>
.
问题:(1)按照a
字段从大到小排序并输出
(2)按照b
字段从小到大排序并输出
说明:你可以对类进行一定改造,也可以借助库函数、库工具等进行实现。
此外,代码尽可能保持简洁,不要有太多冗余
1. 快速开发示例:Comparator+Lambda表达式
java">import java.util.*;class Pair{int a, b;public Pair(int a, int b){this.a = a;this.b = b;}// 方便输出观察@overridepublic String toString(){return String.format("(%d, %d)", a, b);}
}public class Main{public List<Pair> getPairs(){List<Pair> pairs = new ArrayList<>();// ...}public static void main(String[] args){// 构造一个 pairs 实例List<Pair> pairs = getPairs();// 按照字段 a 降序排列, 实现降序只需加负号即可pairs.sort(Comparator.compareInt(p->-p.a));System.out.println(pairs);pairs.sort(Comparator.compareInt(p->p.b));System.out.println(pairs);}
}
如上述示例所示,通过调用集合框架的sort方法并传入Comparator即可实现按照指定字段的排序,对于int类型,已经有一个Comparator.compareInt
可以直接使用,内部使用Lambda表达式指定字段,对于需要降序输出的,添加负号即可。
2. 标准开发示例:Comparator+Getter
通常,按照JavaBean的设计思想,类的字段保持私有,如必要还需要设置为final类型以保证线程安全,对外暴露公共的getter方法,此时代码编写更加规范:
java">import java.util.*;
class Pair{private final int a, b;public Pair(int a, int b){this.a=a;this.b=b;}public int getA(){return a;}public int getB(){return b;}public String toString(){return String.format("(%d,%d)", a, b);}
}
public class Main{public List<Pair> getPairs(){List<Pair> pairs = new ArrayList<>();// ...}public static void main(String[] args){// 构造一个 pairs 实例List<Pair> pairs = getPairs();// 按照字段 a 降序排列, Pair::getA表达式+reversed方法pairs.sort(Comparator.compareInt(Pair::getA).reversed());System.out.println(pairs);// 按照字段 b 升序排列pairs.sort(Comparator.compareInt(Pair::getB));System.out.println(pairs);}
}
3. 若字段a,b为String或者其他的自定义类型(已实现Comparable)
使用更通用的 comparing 方法
java">// 按照 a 降序排列
pairs.sort(Comparator.comparing(Pair::getA).reversed());// 按照 b 升序排列
pairs.sort(Comparator.comparing(Pair::getB));```此处看到getter的好处,在a,b类型变化时,排序代码基本保持不变。### 4. 如何实现 Comparable
假设现在需求并不是通过不同的字段来进行灵活多样的排序,而是结合不同字段实现更复杂的排序行为,此时就需要使用 Comparable 接口,例如通过a+b实现升序排序,或者先通过a进行升序排序,当a相等时通过b升序排序等等,以后者为例,实现代码如下:
```java
import java.util.*;class Pair implements Comparable<Pair>{int a, b;public Pair(int a, int b){this.a = a;this.b = b;}public int compareTo(Pair o){if (this.a==o.a){return this.b-o.b;}return this.a-o.a;}
}
// 排序代码
Collections.sort(pairs);
```