让我们看下这道题目
现有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)));