..,魔鬼在这里发生了什么?
int [] numbers1To9 = new int[]{1,2,3,4,5,6,7,8,9};
System.out.println("one is here, true or false?: "+Arrays.asList(numbers1To9).contains(1));
输出:这里是一个,是真还是假?:false
如果使用排序数组,或者将对未排序数组的排序操作视为“便宜”,则binarySearch
可以将其视为一个不错的选择。它可以Lists
直接与原始数组一起使用,避免了进一步的集合(例如)的创建,并且可以标识存储所需键的位置(或其中一个)。结果,您可以识别其存在(隐式)和索引所在的位置。
您已经对数组进行了排序,因此在您的情况下无需这样做(使用此算法是一个优势)。请注意,在使用未排序的数组时,必须在Arrays.sort
之前调用,binarySearch
以避免出现“未定义”的结果。
例如,如果您想知道值(1
)是否存在:
//Arrays.sort(numbers1To9);
boolean found = (Arrays.binarySearch((numbers1To9), 1))>=0?true:false; //--> true
例如,如果您还希望获得值(2
)的排名,请执行以下操作:
//Arrays.sort(numbers1To9);
int pos = Arrays.binarySearch((numbers1To9), 2); //-->1
boolean found = pos>=0; //--> true
binarySearch
如果找不到该元素,则只会返回负输出。如果找到的键重复,则无法保证指定键的哪个位置会返回。
无论如何,如果结果为>=0
,则保证该数组包含数字,并且还保证所需的值存储在返回的索引中。
没有找到密钥时的结果有点有趣
如果找不到密钥,则显示的否定结果遵循以下逻辑:
(-(插入点)-1)。插入点定义为将键插入数组的点:第一个元素的索引大于键;如果数组中的所有元素都小于指定的键,则为a.length。这样可以保证,并且仅当找到密钥时,返回值才会> = 0。
因此,如果您尝试找到任何大于9的数字,则插入点将为numbers1To9.length -> 9
。因此,10
与INTEGER.MAX_VALUE
将输出相同的位置:
int pos = Arrays.binarySearch((numbers1To9), 10); // -(9)-1 --> pos=-10
pos = Arrays.binarySearch((numbers1To9), Integer.MAX_VALUE); // -(9)-1 --> pos=-10
使用数字0时,插入点将为0
(随着1的增大,其在数组中的位置为0):
int pos = Arrays.binarySearch((numbers1To9), 0); // -(0)-1 --> pos=-1
为了查看binarySearch如何与未排序的数组一起工作:
int [] numberUnsorted= new int[]{1,2,4,9,7,6,5,8,3};
int pos = Arrays.binarySearch((numberUnsorted), 3); //--> pos = -3 (FAIL)
pos = Arrays.binarySearch((numberUnsorted), 9); //--> pos = -10 (FAIL)
pos = Arrays.binarySearch((numberUnsorted), 6); //--> pos = -4 (FAIL)
因此称他们为“不确定”是一个真正的王道千卡
请注意,binarySearch将是在数组中被排序的条件下查找
数组中数字的“最佳实践之一” 。在其他情况下,如果未对数组进行排序,您可能会意识到对数组进行排序的复杂性,并决定不需要排序操作的另一种机制是更好的方法。这将取决于数组的类型,大小和值。在不知道搜索具体上下文的情况下,通常没有“最佳确定方法”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句