Arrays.binarySearch采坑记录及用法
2019-08-16 10:40:35来源:博客园 阅读 ()
Arrays.binarySearch采坑记录及用法
今天在生产环境联调的时候,发现一个很奇怪的问题,明明测试数据正确,结果却是结果不通过,经过debug查询到原来是Arrays.binarySearch用法错误,记录一下,避免后续再次犯错
具体测试如下:
想通过判断J是否存在数组中,结果发现出现如下错误
public static void main(String[] args) { String[] test ={"X","J","7","5","4","11","W8","W7"}; System.out.println("没排序结果 = [" + Arrays.binarySearch(test,"J") + "]"); }
运行结果:
没有排序 = [-7]
进行排序后判断:
public static void main(String[] args) { String[] test ={"X","J","7","5","4","11","W8","W7"}; System.out.println("没排序结果 = [" + Arrays.binarySearch(test,"J") + "]"); Arrays.sort(test); System.out.println("排序后结果 = [" + Arrays.binarySearch(test,"J") + "]"); }
运行结果:
没排序结果 = [-7] 排序后结果 = [4]
在网上查询下具体原因及查询官方解释如下:
/** * Searches the specified array for the specified object using the binary * search algorithm. The array must be sorted into ascending order * according to the * {@linkplain Comparable natural ordering} * of its elements (as by the * {@link #sort(Object[])} method) prior to making this call. * If it is not sorted, the results are undefined. * (If the array contains elements that are not mutually comparable (for * example, strings and integers), it <i>cannot</i> be sorted according * to the natural ordering of its elements, hence results are undefined.) * If the array contains multiple * elements equal to the specified object, there is no guarantee which * one will be found. * * @param a the array to be searched * @param key the value to be searched for * @return index of the search key, if it is contained in the array; * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The * <i>insertion point</i> is defined as the point at which the * key would be inserted into the array: the index of the first * element greater than the key, or <tt>a.length</tt> if all * elements in the array are less than the specified key. Note * that this guarantees that the return value will be >= 0 if * and only if the key is found. * @throws ClassCastException if the search key is not comparable to the * elements of the array. */ public static int binarySearch(Object[] a, Object key) { return binarySearch0(a, 0, a.length, key); }
使用二分搜索法来搜索指定数组,以获得指定对象。在进行此调用之前,必须根据元素的自然顺序对数组进行升序排序(通过 sort(Object[]) 方法)。如果没有对数组进行排序,则结果是不确定的。(如果数组包含不可相互比较的元素(例如,字符串和整数),则无法 根据其元素的自然顺序对数组进行排序,因此结果是不确定的。)如果数组包含多个等于指定对象的元素,则无法保证找到的是哪一个,故所以会出现此问题
如果要判断数组中是否存在,可以使用 ArrayUtils.contains这个方法来判断是否存在,
/** * 校验服务类型是否符合枚举值 * @param possibility 可能性 * @param field 字段 * @param info 校验不通过的错误消息 * */ public void validatePossibility(String[] possibility,String field,ErrorInfo info){ boolean flag = ArrayUtils.contains(possibility,field); if (!flag) { throw getException(info) ; } }
原文链接:https://www.cnblogs.com/lewisat/p/11211297.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- JAVA 每次从List中取出100条记录 2020-05-27
- 初识JAVA(学习记录) 2020-05-19
- 错题记录——关于Java中private的用法(类与封装) 2020-05-16
- 坚持学习,坚持写博客,记录学习的点点滴滴,先从学习JAVA开 2020-05-16
- Spring Batch 读 10 万条记录,写到 MongoDB 2020-05-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash