本文共 3732 字,大约阅读时间需要 12 分钟。
在Java中,对象的比较通常只能使用 == 或 !=。然而,在实际开发中,我们常常需要对多个对象进行排序。这就需要使用 Comparable 或 Comparator 接口。
Comparable 接口进行自然排序Comparable 接口是一个自然比较接口,常见的实现类包括 String 和包装类。通过实现 Comparable 接口并重写 compareTo 方法,我们可以定义对象的比较逻辑。
compareTo 方法的规则this 大于形参对象 obj,返回 正整数。this 小于形参对象 obj,返回 负整数。this 等于形参对象 obj,返回 零。compareTo 方法示例以下是 String 类的 compareTo 方法源码:
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; // 小于返回负数,大于返回正数 } k++; } return len1 - len2;} 对于自定义类,例如 GoodsTest,如果需要根据 price 属性排序,可以实现 Comparable 接口并重写 compareTo 方法:
public class GoodsTest implements Comparable { private String name; private double price; public GoodsTest(String name, double price) { this.name = name; this.price = price; } @Override public int compareTo(Object o) { if (o instanceof GoodsTest) { GoodsTest good = (GoodsTest) o; if (this.price > good.price) { return 1; } else if (this.price < good.price) { return -1; } else { return 0; } } throw new RuntimeException("传入的数据类型不一致!"); }} @Testpublic void test2() { GoodsTest[] arr = new GoodsTest[4]; arr[0] = new GoodsTest("商品1", 22); arr[1] = new GoodsTest("商品2", 154); arr[2] = new GoodsTest("商品3", 67); arr[3] = new GoodsTest("商品4", 88); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出结果:[GoodsTest{name='商品1', price=22.0}, GoodsTest{name='商品3', price=67.0}, GoodsTest{name='商品4', price=88.0}, GoodsTest{name='商品2', price=154.0}]} Comparator 接口进行定制排序当对象没有实现 Comparable 接口或者现有的比较逻辑不适合当前需求时,可以使用 Comparator 接口进行定制排序。通过重写 compare 方法,可以自定义比较逻辑。
@Testpublic void test3() { String[] arr = new String[]{"AA", "CC", "MM", "DD", "GG", "BB"}; Arrays.sort(arr, new Comparator () { @Override public int compare(String o1, String o2) { if (o1 instanceof String && o2 instanceof String) { String s1 = (String) o1; String s2 = (String) o2; return -s1.compareTo(s2); // compareTo默认从小到大,加负号从大到小 } throw new RuntimeException("输入的类型不一致!"); } }); System.out.println(Arrays.toString(arr)); // 输出结果:[MM, GG, DD, CC, BB, AA]} @Testpublic void test4() { GoodsTest[] arr = new GoodsTest[4]; arr[0] = new GoodsTest("商品1", 22); arr[1] = new GoodsTest("商品2", 154); arr[2] = new GoodsTest("商品3", 67); arr[3] = new GoodsTest("商品4", 88); Arrays.sort(arr, new Comparator () { @Override public int compare(GoodsTest o1, GoodsTest o2) { if (o1 instanceof GoodsTest && o2 instanceof GoodsTest) { GoodsTest g1 = (GoodsTest) o1; GoodsTest g2 = (GoodsTest) o2; if (g1.getName().equals(g2.getName())) { return -Double.compare(g1.getPrice(), g2.getPrice()); } else { return g1.getName().compareTo(g2.getName()); } } throw new RuntimeException("输入的数据类型不一致"); } }); System.out.println(Arrays.toString(arr)); // 输出结果:[GoodsTest{name='商品1', price=22.0}, GoodsTest{name='商品2', price=154.0}, GoodsTest{name='商品3', price=67.0}, GoodsTest{name='商品4', price=88.0}]} 转载地址:http://bnpi.baihongyu.com/