首页 > 代码库 > Comparable接口和Comparator接口的不同用法
Comparable接口和Comparator接口的不同用法
两者都可用来在定义比较方法,然后用在排序中。
Comparable是类本身继承的接口
Comparator实在类外定义一个排序的类
比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。
举个栗子:
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Main { 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)); // 用Comparator排序 -- 按照两个数的和排序 list.sort(new PairComparator()); for (Pair p: list) System.out.println(p); System.out.println(); // 用Comparable排序 -- 先按第一个数排序 再按第二个数排序 Collections.sort(list); for (Pair p: list) System.out.println(p); }}class PairComparator implements Comparator<Pair> { @Override public int compare(Pair p1, Pair p2) { int sum1 = p1.getSum(); int sum2 = p2.getSum(); return (sum1 == sum2 ? 0 : (sum1 < sum2 ? -1 : 1)); } }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() + "]"; } }
输出:
[first:8, second:1, sum:9][first:6, second:3, sum:9][first:6, second:5, sum:11][first:5, second:7, sum:12][first:4, second:9, sum:13][first:4, second:9, sum:13][first:5, second:7, sum:12][first:6, second:3, sum:9][first:6, second:5, sum:11][first:8, second:1, sum:9]
对于一些已经写好的类,比如String,我们当然不能去修改它的compareTo()方法,于是可以写一个自定义的比较器。
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("abcd"); list.add("bcd"); list.add("cd"); list.add("d"); Collections.sort(list); System.out.println(list); list.sort(new MyStringComparator()); System.out.println(list); }}// 自定义的String排序方法 按字符串长度排序class MyStringComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { int len1 = o1.length(); int len2 = o2.length(); return (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1)); } }
输出:
[abcd, bcd, cd, d][d, cd, bcd, abcd]
Comparable接口和Comparator接口的不同用法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。