基于集合内部外部比较器排序后查找的思考

1 篇文章 0 订阅
1 篇文章 0 订阅

让我们看下这道题目

现有5条狗(姓名,年龄),将他们存入List集合中,先随机打乱,然后使用工具类,对这一群狗按照年龄进行排序。之后再查找一个名称叫 大黄 的狗

首先我们要做的是将狗类创建出来,给他装上一个比较器或在排序时调用一个比较器

Dog类代码如下

public class Dog implements Comparable<Dog>{
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Monkey{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Dog o) {
        return this.age-o.age;
    }
}

然后开始写测试类为他们赋值

代码如下

        Dog dog1 = new Dog("花花", 5);
        Dog dog2  = new Dog("东香", 6);
        Dog dog3  = new Dog("西乡", 10);
        Dog dog4  = new Dog("大黄", 3);
        Dog dog5  = new Dog("南方", 8);
        ArrayList<Dog> list = new ArrayList();
        list.add(dog1);
        list.add(dog2);
        list.add(dog3);
        list.add(dog4);
        list.add(dog5);

调用Collections中的方法为他以年龄排序,并输出

代码如下

   Collections.sort(list);
        System.out.println(list);

在这里插入图片描述

可以看到我们让他们成功以年龄大小而排序了
现在让我们在使用binarySearch方法寻找名为大黄的狗。

   System.out.println("大黄在" + Collections.binarySearch(list, new Dog("大黄", 8)));

然而发现此binarSearch却是按照年龄搜索的
在这里插入图片描述
在这里插入图片描述
原来binarySearch这个方法也需要一个有关变量比较器才可以寻找有关变量,默认的是类的内部比较器。
如图所示:
在这里插入图片描述

解决方法也很简单,binarySearch中可以再添加个比较器参数,于是我们可以先创建一个外部比较器:

public class NameCompartor implements Comparator<Dog> {
    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.name.compareTo(o2.name);
    }
}

之后使用外部比较器排序并在binarySearch中添加参数:

 Collections.sort(list,new NameCompartor());
 System.out.println("大黄在" + Collections.binarySearch(list, new Dog("大黄", 5),new NameCompartor()));

这样就可以用binarySearch找到大黄了:

在这里插入图片描述
顺带一提:也可以用匿名内部类来代替这个外部比较器
在这里插入图片描述

代码如下

  Collections.sort(list, new Comparator<Dog>() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.name.compareTo(o2.name);
            }
        });
        System.out.println(list);
        System.out.println("大黄在" + Collections.binarySearch(list, new Dog("大黄", 5), new Comparator<Dog>() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.name.compareTo(o2.name);
            }
        }));

这个有更简单的写法:

         Collections.sort(list,(o1,o2)->o1.name.compareTo(o2.name));
        System.out.println(list);
        System.out.println("大黄在" + Collections.binarySearch(list, new Dog("大黄", 5),(o1,o2)-> o1.name.compareTo(o2.name)));

在这里插入图片描述

总结

以上就是今天要讲的内容,外部比较器,内部比较器和匿名内部类比较器三者对比起来我认为,外部可以被匿名代替,但如果有多个排序要调用这个比较器的话还是写个外部可能更简单,而内部多半可以用于默认比较属性,一般的数据可能排序也就是需要一次正规的比较吧。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值