黑马程序员技术交流社区

标题: 求解答,为甚么Collections.binarySearch结果不是预期值 [打印本页]

作者: 晓月残魂    时间: 2015-8-13 22:21
标题: 求解答,为甚么Collections.binarySearch结果不是预期值
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Person implements Comparable<Person>
{
        String name;
        int age;
        // 为方便,没有写get、set方法
        public Person(String name, int age)
        {
                this.name = name;
                this.age = age;
        }
        public String toString()
        {
                return this.name + "----" + this.age;
        }
        public int compareTo(Person p)
        {// 安装姓名排序
                int num;
                return (num = this.name.compareTo(p.name)) == 0 ? this.age - p.age : num;
        }
}

public class Main
{
        public static void main(String[] args)
        {
                ArrayList<Person> arrayList = new ArrayList<Person>();
                arrayList.add(new Person("ZhangSan", 23));
                arrayList.add(new Person("LiSi", 25));
                arrayList.add(new Person("WangWu", 18));
                arrayList.add(new Person("ZhaoLiu", 32));
                arrayList.add(new Person("ZhangSan", 23));
                arrayList.add(new Person("LiSi", 23));
                Collections.sort(arrayList, new Comparator<Person>()
                {// 匿名内部类
                        public int compare(Person p1, Person p2)
                        {// 按照年龄排序
                                int num;
                                return (num = p1.age - p2.age) == 0 ? p1.name.compareTo(p2.name) : num;
                        }
                });
                // Collections.sort(arrayList);
                System.out.println(arrayList);
                int num;
                num = Collections.binarySearch(arrayList, new Person("LiSi", 23));  //LiSi,23这个人集合中有啊
                System.out.println(num);
                num = Collections.binarySearch(arrayList, new Person("ZhangSan", 23));
                System.out.println(num);
                num = Collections.binarySearch(arrayList, new Person("ZhaoLiu", 32));
                System.out.println(num);
        }
}

我的运行结果
[WangWu----18, LiSi----23, ZhangSan----23, ZhangSan----23, LiSi----25, ZhaoLiu----32]
-1              //搞不明白这里为什么是-1
2
5




作者: 晓月残魂    时间: 2015-8-13 23:04
求~~~~~~~~~~~~
作者: nightingale    时间: 2015-8-13 23:40
从打印结果可以看出,最后集合时按年龄排序的。
但是,楼主使用二分法查找集合元素时,没有指定比较器,所以使用元素自身的比较性。而元素自身比较性是按姓名排列的。这时集合元素不是按姓名排序的,也就等于二分法实在查找无序集合。
解决办法是使用二分法查找时,再指定是按照指定比较器(按年龄顺序)的方式来比较。
作者: 晓月残魂    时间: 2015-8-14 15:42
明白了,三克油~~~~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2