Dos formas de encontrar elementos de matriz en Java:
1. Búscalos uno a uno hasta encontrarlos.
código:
public class Array02 {
public static void main(String[] args) {
int[] arr = {11,22,33,10,32,23,43,12,43};
// 找出arr这个数组中200所在的下标。
// 调用方法。
int num = 12;
int index = arraySearch(arr,num);
System.out.println(index == -1 ? num + "元素不存在!" : num + "元素的下标:" + index);
}
/**
* 从数组检索某个元素的下标,返回的是第一个该元素的下标,因为for循环是从前到后的
* @param arr 被检索的数组
* @param ele 被检索的元素
* @return -1 表示该元素不存在,其他表示返回目标元素的下标。
*/
public static int arraySearch(int[] arr, int ele) {
for (int i = 0; i < arr.length; i++) {
if (ele == arr[i]){
return i;
}
}
return -1;
}
}
resultado de la operación:
D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=53903:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.Array02
12元素的下标:7
Process finished with exit code 0
2. El segundo método: búsqueda binaria (algoritmo), que es más eficiente.
Búsqueda binaria (media búsqueda)
Primero: La búsqueda binaria se basa en la clasificación.
Segundo: La eficiencia de la búsqueda binaria es mayor que la de "uno por uno".
Tercero: ¿Principio de búsqueda de dicotomía?
10 23 56 89 100 111 222 235 500 600 matriz matriz
0 1 2 3 4 5 6 7 8 9Objetivo: encontrar el subíndice de 600
Subíndice inicial: 0
Subíndice final: 9
(0 + 9) / 2 ---> 4 (subíndice del elemento central)
arr[4] Este elemento es el elemento central: arr[4 ]= 100
100 < 600
indica que el elemento buscado está a la derecha de 100Subíndice inicial: 4 + 1
Subíndice final: 9
(5 + 9) / 2 = 7 (el subíndice del elemento central)
arr[7] es el elemento central, correspondiente a 235
235 < 600
significa que el elemento buscado está en el derecho de 235Subíndice inicial: 7 + 1
Subíndice final: 9
(8 + 9) / 2 = 8 (el subíndice del elemento central)
arr[8] es el elemento central, correspondiente a 500
500 < 600
significa que el elemento buscado está en el derecho de 235Subíndice inicial: 8 + 1
Subíndice final: 9
(9 + 9) / 2 = 9 (el subíndice del elemento central)
arr[9] es el elemento central, correspondiente a 600
600 = 600
encontrado en este momentoLa condición de terminación de la búsqueda binaria: seguir reduciendo a la mitad, sabiendo que el elemento en el medio es exactamente el elemento que se busca.
código:
public class ArrayUtil {
public static void main(String[] args) {
// 这个数组已经排序的。
int[] arr = {100,200,230,235,600,1000,2000,9999};
// 找出arr这个数组中200所在的下标。
// 调用方法。
int num = 200;
int index = binarySearch(arr,num);
System.out.println(index == -1 ? num + "元素不存在!" : num+ "元素的下标:" + index);
}
/**
* 从数组中查找目标元素的下标。
* @param arr 被查找的数组(这个必须已经排序的)。
* @param dest 目标元素
* @return -1 表示该元素不存在,其他表示返回目标元素的下标。
*/
public static int binarySearch(int[] arr, int dest) {
// 开始下标。
int begin = 0;
// 结束下标.
int end = arr.length - 1;
// 开始元素下标只要在结束元素下标的左边,就有机会继续循环。
while(begin <= end){
// 中间元素下标
int mid = (begin + end) / 2;
if (arr[mid] == dest){
return mid;
} else if (arr[mid] < dest){
// 目标在“中间“的右边。
// 开始元素下标需要发生变化(开始元素的下标需要重新赋值)。
begin = mid + 1; // 一直增。
} else {
// arr[mid] > dest
// 目标元素在”中间“左边
// 修改结束元素下标
end = mid - 1; // 一直减
}
}
return -1;
}
}
resultado de la operación:
D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=53989:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.ArrayUtil
200元素的下标:1
Process finished with exit code 0
3. Buenas noticias
(1) SUN ha escrito una clase de herramienta de matriz para nuestros programadores.
(2)java.util.Matrices;
(3) java.util.Arrays; ¿Cuáles son los métodos de la clase de herramienta? Debemos consultar el documento de ayuda de la API cuando desarrollamos.
código:
// 导入数组工具包
import java.util.Arrays;
public class ArrayTest01 {
public static void main(String[] args) {
int[] arr = {3,6,5,1,2,32};
// 排序
Arrays.sort(arr);
// 遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
// 分隔
System.out.println("\n=======");
// 二分法查找(建立在排序的基础之上)如果有相同的,遇到谁就是谁,不一定是第一个
int num = 32;
int index = Arrays.binarySearch(arr,num);
System.out.println(index == -1 ? num + "元素不存在!" : num+ "元素的下标:" + index);
}
}
resultado de la operación:
D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=54342:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.ArrayTest01
1 2 3 5 6 32
=======
32元素的下标:5
Process finished with exit code 0