1700444804
1700444805
indexOf方法就是一个遍历,找到第一个元素值相等则返回,没什么玄机。回到我们的程序上来看,for循环的第二遍即是我们要查找的“广州”,于是就返回索引值1了,也正确,没有任何问题。
1700444806
1700444807
两者的算法都没有问题,难道是我们用错了?这还真是我们的错,因为二分法查询的一个首要前提是:数据集已经实现升序排列,否则二分法查找的值是不准确的。不排序怎么确定是在小区(比中间值小的区域)中查找还是在大区(比中间值大的区域)中查找呢?二分法查找必须要先排序,这是二分法查找的首要条件。
1700444808
1700444809
问题清楚了,藐视解决方法也很简单,使用Collections.sort排下序即可解决。但这样真的可以解决吗?想想看,元素数据是从Web或数据库中传递进来的,原本是一个有规则的业务数据,我们为了查找一个元素对它进行了排序,也就是改变了元素在列表中的位置,那谁来保证业务规则此时的正确性呢?所以说,binarySearch方法在此处受限了。当然,拷贝一个数组,然后再排序,再使用binarySeach查找指定值,也可以解决该问题。
1700444810
1700444811
使用binarySearch首先要考虑排序问题,这是我们编码人员经常容易忘记的,而且在测试期间还没发现问题(因为测试时“制造”的数据都很有规律),等到投入生产系统后才发现查找的数据不准确,又是一个大Bug产生了,从这点来看,indexOf要比binarySearch简单得多。
1700444812
1700444813
当然,使用binarySearch的二分法查找比indexOf的遍历算法性能上高很多,特别是在大数据集而且目标值又接近尾部时,binarySearch方法与indexOf相比,性能上会提升几十倍,因此在从性能的角度考虑时可以选择binarySearch。
1700444814
1700444815
注意 从性能方面考虑,binarySearch是最好的选择。
1700444816
1700444817
1700444818
1700444819
1700444821
编写高质量代码:改善Java程序的151个建议 建议75:集合中的元素必须做到compareTo和equals同步
1700444822
1700444823
实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法有关系吗?有关系,在compareTo的返回为0时,它表示的是进行比较的两个元素是相等的。equals是不是也应该对此作出相应的动作呢?我们看如下代码。
1700444824
1700444825
class City implements Comparable<City>{
1700444826
1700444827
//城市编码
1700444828
1700444829
private String code;
1700444830
1700444831
//城市名称
1700444832
1700444833
private String name;
1700444834
1700444835
public City(String_code, String_name){
1700444836
1700444837
code=_code;
1700444838
1700444839
name=_name;
1700444840
1700444841
}
1700444842
1700444843
/*code、name的getter/setter方法省略*/
1700444844
1700444845
@Override
1700444846
1700444847
public int compareTo(City o){
1700444848
1700444849
//按照城市名称排序
1700444850
1700444851
return new CompareToBuilder()
1700444852
1700444853
.append(name, o.name)
[
上一页 ]
[ :1.700444804e+09 ]
[
下一页 ]