自定义List类型,Pair里面有两个int元素:first,Second。List简写为A={[1,2],[1,1],[8,5],[6,3]}。
如何对A中所有数据第一个数字进行排序,如果第一个数字相同用第二个数字排序?排序结果为A={[1,1],[1,2],[6,3],[8,5]}
使用Comparable接口,在需对比的实体类上实现该接口的 conparaTo方法
class Pair implements Comparable<Pair> {
private int first;
private int second;
public Pair(int first, int second) {
this.first = first;
this.second = second;
}
@Override
public int compareTo(Pair p) {
if (first == p.first) {
if (second == p.second) return 0;
return second < p.second ? -1 : 1;
}
return first < p.first ? -1 : 1;
}
public int getSum() {
return first + second;
}
public String toString() {
return "[first:" + first + ", second:" + second + ", sum:" + getSum() + "]";
}
}
使用Collections.sort(list);激活排序
public static void main(String[] args) {
ArrayList<Pair> list = new ArrayList<>();
list.add(new Pair(8, 1));
list.add(new Pair(6, 5));
list.add(new Pair(6, 3));
list.add(new Pair(5, 7));
list.add(new Pair(4, 9));
// 用Comparable排序 -- 先按第一个数排序 再按第二个数排序
Collections.sort(list);
for (Pair p: list){
System.out.println(p);
}
}
为了保证的封装类型,使用外部Coparator进行排序
在外部时使用匿名内部类Comparator进行排序构造
Collections.sort(list2, new Comparator<Pair2>() {
@Override
public int compare(Pair2 o2, Pair2 o1) {
if (o2.getFirst()-o1.getSecond() ==0){
return o2.getSecond()-o1.getSecond();
}
return o2.getFirst()-o1.getFirst();
}
});