黑马程序员技术交流社区
标题:
求解答,为甚么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