La búsqueda binaria nunca funcionará en una matriz sin clasificar.
Chris Eberle
Entonces, ¿puedes sugerirme algo? ¿Cómo debo hacerlo? Porque si ordeno la matriz, pierdo la pista de los índices y necesito saber de qué índice proviene el valor.
Jeomark
EDITAR: Olvidé agregar, también necesito encontrar el índice de matriz para valores dobles.
Jeomark
1
Si no desea ordenar la matriz, simplemente use un bucle for simple para encontrar el valor.
Jamie Curtis
2
Generalmente es bueno leer la documentación de las funciones :) De binarySearch: "Busca en la matriz especificada de ... el valor especificado usando el algoritmo de búsqueda binaria. La matriz debe ser ordenada (como por el método sort (long [])) antes para realizar esta llamada. Si no está ordenada, los resultados no están definidos. ... "
Gracias, pero ¿funcionaría para el tipo doble? Lo siento, olvidé mencionar en la pregunta, pero también necesito trabajar esto para valores dobles. Sin embargo, funciona bien con ints.
Jeomark
Sí, no tiene que cambiar nada (pero el tipo de matriz obviamente)
Necesita convertir la matriz a Integer [] en lugar de int []. las matrices primitivas no se encuadran automáticamente.
Leon Helmsley
1
¿Es esto realmente seguro para subprocesos? Cuando hago clic en la fuente, List.asList () crea una ArrayList que toma la matriz int directamente como contenedor de datos (no copia)
Langusten Gustel
26
Otra opción si está utilizando Guava Collections es Ints.indexOf
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
doble pitido
4
Puede usar Java moderno para resolver este problema. Utilice el siguiente código:
¡Excelente! Gracias por compartir. Ayuda a aprender sobre las nuevas soluciones integradas (optimizadas) dentro del contexto de las capacidades del lenguaje.
Guillermo García
3
Puede convertirlo en una lista y luego usar el método indexOf:
Ésta es una forma, sí. Sin embargo, es no la única manera. El uso de la variable booleana foundaquí es inútil (y no se usa) y debe eliminarse. Sin embargo, un +1 para mostrar "el método de bucle manual" (dejando de lado los problemas de estilo y formato).
La forma más sencilla es iterar. Por ejemplo, queremos encontrar el valor mínimo de la matriz y su índice:
publicstatic Pair<Integer, Integer> getMinimumAndIndex(int[] array){
int min = array[0];
int index = 0;
for (int i = 1; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
index = i;
}
returnnew Pair<min, index>;
De esta manera, prueba todos los valores de la matriz y, si algunos de ellos son mínimos, también conoce el índice de mínimos. Puede funcionar igual con la búsqueda de algún valor:
publicstaticintindexOfNumber(int[] array){
int index = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] == 77) { // here you pass some value for example 77
index = i;
}
}
return index;
}
Puede recorrer la matriz hasta encontrar el índice que está buscando o usar un List. Tenga en cuenta que puede transformar la matriz en una lista con asList().
/**
* Method to get the index of the given item from the list
* @param stringArray
* @param name
* @return index of the item if item exists else return -1
*/publicstaticintgetIndexOfItemInArray(String[] stringArray, String name){
if (stringArray != null && stringArray.length > 0) {
ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
int index = list.indexOf(name);
list.clear();
return index;
}
return -1;
}
El cleary el new ArrayListson operaciones innecesarias. La asignación de una nueva ArrayListcopia toda la matriz, lo cual no tiene sentido, porque Arrays.asListya devuelve un Listque tiene un indexOfmétodo. No es necesario borrar la copia de la lista, GC la eliminará de todos modos.
TWiStErRob
0
Puedes hacerlo así:
publicclassTest{
publicstaticint Tab[] = {33,44,55,66,7,88,44,11,23,45,32,12,95};
publicstaticint search = 23;
publicstaticvoidmain(String[] args){
long stop = 0;
long time = 0;
long start = 0;
start = System.nanoTime();
int index = getIndexOf(search,Tab);
stop = System.nanoTime();
time = stop - start;
System.out.println("equal to took in nano seconds ="+time);
System.out.println("Index of searched value is: "+index);
System.out.println("De value of Tab with searched index is: "+Tab[index]);
System.out.println("==========================================================");
start = System.nanoTime();
int Bindex = bitSearch(search,Tab);
stop = System.nanoTime();
time = stop - start;
System.out.println("Binary search took nano seconds ="+time);
System.out.println("Index of searched value is: "+Bindex);
System.out.println("De value of Tab with searched index is: "+Tab[Bindex]);
}
publicstaticintgetIndexOf( int toSearch, int[] tab ){
int i = 0;
while(!(tab[i] == toSearch) )
{ i++; }
return i; // or return tab[i];
}
publicstaticintbitSearch(int toSearch, int[] tab){
int i = 0;
for(;(toSearch^tab[i])!=0;i++){
}
return i;
}
tab.equals(toSearch)está comparando una matriz con un int. Quizás en su tab[i] == toSearchlugar.
Mike Samuel
Esto funciona gracias Mike ... Google por la búsqueda binaria, hay algunos artículos interesantes y es un método interesante
Andre
@Andre si usted está tratando de demostrar un punto de darles la igualdad de condiciones (mismo orden, el mismo flujo de control): while (tab[i] != toSearch) i++;VS while ((tab[i] ^ toSearch) != 0) i++;.
TWiStErRob
1
En cualquier caso, esta forma de cronometraje no funciona, para mí bitSearchsiempre es más rápido que getIndexOf; mientras que si simplemente cambio las llamadas a los dos métodos se getIndexOfvuelve más rápido que bitSearch. Esto demuestra claramente que el segundo siempre es más rápido por alguna razón interna de JVM. Debería estar repitiendo el experimento muchas veces (probablemente millones), promediando los valores, descartando los valores extremos y haciendo un calentamiento que es muy similar a la prueba.
TWiStErRob
0
En el método principal que usa bucles for: -el tercer bucle for en mi ejemplo es la respuesta a esta pregunta. -en mi ejemplo hice una matriz de 20 enteros aleatorios, asigné a una variable el número más pequeño y detuve el ciclo cuando la ubicación de la matriz alcanzó el valor más pequeño mientras contaba el número de ciclos.
import java.util.Random;
publicclassscratch{
publicstaticvoidmain(String[] args){
Random rnd = new Random();
int randomIntegers[] = newint[20];
double smallest = randomIntegers[0];
int location = 0;
for(int i = 0; i < randomIntegers.length; i++){ // fills array with random integers
randomIntegers[i] = rnd.nextInt(99) + 1;
System.out.println(" --" + i + "-- " + randomIntegers[i]);
}
for (int i = 0; i < randomIntegers.length; i++){ // get the location of smallest number in the array if(randomIntegers[i] < smallest){
smallest = randomIntegers[i];
}
}
for (int i = 0; i < randomIntegers.length; i++){
if(randomIntegers[i] == smallest){ //break the loop when array location value == <smallest>break;
}
location ++;
}
System.out.println("location: " + location + "\nsmallest: " + smallest);
}
}
El código genera todos los números y sus ubicaciones, y la ubicación del número más pequeño seguido del número más pequeño.
Búsqueda binaria: la búsqueda binaria también se puede utilizar para encontrar el índice del elemento de la matriz en una matriz. Pero la búsqueda binaria solo se puede usar si la matriz está ordenada. Java nos proporciona una función incorporada que se puede encontrar en la biblioteca Arrays de Java que devolverá el índice si el elemento está presente, de lo contrario, devuelve -1. La complejidad será O (log n). A continuación se muestra la implementación de la búsqueda binaria.
publicstaticintfindIndex(int arr[], int t){
int index = Arrays.binarySearch(arr, t);
return (index < 0) ? -1 : index;
}
binarySearch
: "Busca en la matriz especificada de ... el valor especificado usando el algoritmo de búsqueda binaria. La matriz debe ser ordenada (como por el método sort (long [])) antes para realizar esta llamada. Si no está ordenada, los resultados no están definidos. ... "Respuestas:
Integer[] array = {1,2,3,4,5,6}; Arrays.asList(array).indexOf(4);
Tenga en cuenta que esta solución es segura para subprocesos porque crea un nuevo objeto de tipo Lista.
Además, no desea invocar esto en un bucle o algo así, ya que estaría creando un nuevo objeto cada vez
fuente
Otra opción si está utilizando Guava Collections es Ints.indexOf
// Perfect storm: final int needle = 42; final int[] haystack = [1, 2, 3, 42]; // Spoiler alert: index == 3 final int index = Ints.indexOf(haystack, needle);
Esta es una gran opción cuando el espacio, el tiempo y la reutilización de código son un bien escaso. También es muy escueto.
fuente
Una mirada a la API y dice que primero debes ordenar la matriz
Entonces:
Si no desea ordenar la matriz:
public int find(double[] array, double value) { for(int i=0; i<array.length; i++) if(array[i] == value) return i; }
fuente
Arrays.sort
muta la entrada y se modificará la matriz original.Copia este método en tu clase
public int getArrayIndex(int[] arr,int value) { int k=0; for(int i=0;i<arr.length;i++){ if(arr[i]==value){ k=i; break; } } return k; }
Llame a este método con pasar dos parámetros Array y value y almacene su valor de retorno en una variable entera.
int indexNum = getArrayIndex(array,value);
Gracias
fuente
fuente
Puede usar Java moderno para resolver este problema. Utilice el siguiente código:
static int findIndexOf(int V, int[] arr) { return IntStream.range(1, arr.length).filter(i->arr[i]==V).findFirst().getAsInt(); }
fuente
Puede convertirlo en una lista y luego usar el método indexOf:
Array.asList(array).indexOf(1);
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#asList(T ...) http://download.oracle.com/javase/1.5.0 /docs/api/java/util/List.html#indexOf(java.lang.Object )
fuente
Debe ordenar los valores antes de utilizar la búsqueda binaria. De lo contrario, la forma manual es probar todas las entradas en su pestaña.
public int getIndexOf( int toSearch, int[] tab ) { for( int i=0; i< tab.length ; i ++ ) if( tab[ i ] == toSearch) return i; return -1; }//met
Un método alternativo podría ser mapear todos los índices para cada valor en un mapa.
tab[ index ] = value; if( map.get( value) == null || map.get( value) > index ) map.put( value, index );
y luego map.get (valor) para obtener el índice.
Saludos, Stéphane
@pst, gracias por tus comentarios. ¿Puedes publicar otro método alternativo?
fuente
found
aquí es inútil (y no se usa) y debe eliminarse. Sin embargo, un +1 para mostrar "el método de bucle manual" (dejando de lado los problemas de estilo y formato).Simple:
public int getArrayIndex(int[] arr,int value) { for(int i=0;i<arr.length;i++) if(arr[i]==value) return i; return -1; }
fuente
Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 }; List<Integer> arrlst = Arrays.asList(arr); System.out.println(arrlst.lastIndexOf(1));
fuente
En caso de que alguien todavía esté buscando la respuesta-
Puede utilizar ArrayUtils.indexOf () de la [Apache Commons Library] [1].
Si está utilizando Java 8, también puede utilizar la API de Strean:
public static int indexOf(int[] array, int valueToFind) { if (array == null) { return -1; } return IntStream.range(0, array.length) .filter(i -> valueToFind == array[i]) .findFirst() .orElse(-1); }
[1]: https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#indexOf(int[],%20int)
fuente
La forma más sencilla es iterar. Por ejemplo, queremos encontrar el valor mínimo de la matriz y su índice:
public static Pair<Integer, Integer> getMinimumAndIndex(int[] array) { int min = array[0]; int index = 0; for (int i = 1; i < array.length; i++) { if (array[i] < min) { min = array[i]; index = i; } return new Pair<min, index>;
De esta manera, prueba todos los valores de la matriz y, si algunos de ellos son mínimos, también conoce el índice de mínimos. Puede funcionar igual con la búsqueda de algún valor:
public static int indexOfNumber(int[] array) { int index = 0; for (int i = 0; i < array.length; i++) { if (array[i] == 77) { // here you pass some value for example 77 index = i; } } return index; }
fuente
Puede recorrer la matriz hasta encontrar el índice que está buscando o usar un
List
. Tenga en cuenta que puede transformar la matriz en una lista conasList()
.fuente
/** * Method to get the index of the given item from the list * @param stringArray * @param name * @return index of the item if item exists else return -1 */ public static int getIndexOfItemInArray(String[] stringArray, String name) { if (stringArray != null && stringArray.length > 0) { ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray)); int index = list.indexOf(name); list.clear(); return index; } return -1; }
fuente
clear
y elnew ArrayList
son operaciones innecesarias. La asignación de una nuevaArrayList
copia toda la matriz, lo cual no tiene sentido, porqueArrays.asList
ya devuelve unList
que tiene unindexOf
método. No es necesario borrar la copia de la lista, GC la eliminará de todos modos.Puedes hacerlo así:
public class Test { public static int Tab[] = {33,44,55,66,7,88,44,11,23,45,32,12,95}; public static int search = 23; public static void main(String[] args) { long stop = 0; long time = 0; long start = 0; start = System.nanoTime(); int index = getIndexOf(search,Tab); stop = System.nanoTime(); time = stop - start; System.out.println("equal to took in nano seconds ="+time); System.out.println("Index of searched value is: "+index); System.out.println("De value of Tab with searched index is: "+Tab[index]); System.out.println("=========================================================="); start = System.nanoTime(); int Bindex = bitSearch(search,Tab); stop = System.nanoTime(); time = stop - start; System.out.println("Binary search took nano seconds ="+time); System.out.println("Index of searched value is: "+Bindex); System.out.println("De value of Tab with searched index is: "+Tab[Bindex]); } public static int getIndexOf( int toSearch, int[] tab ){ int i = 0; while(!(tab[i] == toSearch) ) { i++; } return i; // or return tab[i]; } public static int bitSearch(int toSearch, int[] tab){ int i = 0; for(;(toSearch^tab[i])!=0;i++){ } return i; }
}
Se agregó un XOR :)
fuente
tab.equals(toSearch)
está comparando una matriz con un int. Quizás en sutab[i] == toSearch
lugar.while (tab[i] != toSearch) i++;
VSwhile ((tab[i] ^ toSearch) != 0) i++;
.bitSearch
siempre es más rápido quegetIndexOf
; mientras que si simplemente cambio las llamadas a los dos métodos segetIndexOf
vuelve más rápido quebitSearch
. Esto demuestra claramente que el segundo siempre es más rápido por alguna razón interna de JVM. Debería estar repitiendo el experimento muchas veces (probablemente millones), promediando los valores, descartando los valores extremos y haciendo un calentamiento que es muy similar a la prueba.En el método principal que usa bucles for: -el tercer bucle for en mi ejemplo es la respuesta a esta pregunta. -en mi ejemplo hice una matriz de 20 enteros aleatorios, asigné a una variable el número más pequeño y detuve el ciclo cuando la ubicación de la matriz alcanzó el valor más pequeño mientras contaba el número de ciclos.
import java.util.Random; public class scratch { public static void main(String[] args){ Random rnd = new Random(); int randomIntegers[] = new int[20]; double smallest = randomIntegers[0]; int location = 0; for(int i = 0; i < randomIntegers.length; i++){ // fills array with random integers randomIntegers[i] = rnd.nextInt(99) + 1; System.out.println(" --" + i + "-- " + randomIntegers[i]); } for (int i = 0; i < randomIntegers.length; i++){ // get the location of smallest number in the array if(randomIntegers[i] < smallest){ smallest = randomIntegers[i]; } } for (int i = 0; i < randomIntegers.length; i++){ if(randomIntegers[i] == smallest){ //break the loop when array location value == <smallest> break; } location ++; } System.out.println("location: " + location + "\nsmallest: " + smallest); } }
El código genera todos los números y sus ubicaciones, y la ubicación del número más pequeño seguido del número más pequeño.
fuente
static int[] getIndex(int[] data, int number) { int[] positions = new int[data.length]; if (data.length > 0) { int counter = 0; for(int i =0; i < data.length; i++) { if(data[i] == number){ positions[counter] = i; counter++; } } } return positions; }
fuente
Búsqueda binaria: la búsqueda binaria también se puede utilizar para encontrar el índice del elemento de la matriz en una matriz. Pero la búsqueda binaria solo se puede usar si la matriz está ordenada. Java nos proporciona una función incorporada que se puede encontrar en la biblioteca Arrays de Java que devolverá el índice si el elemento está presente, de lo contrario, devuelve -1. La complejidad será O (log n). A continuación se muestra la implementación de la búsqueda binaria.
public static int findIndex(int arr[], int t) { int index = Arrays.binarySearch(arr, t); return (index < 0) ? -1 : index; }
fuente
Integer[] array = {1, 2, 3, 4, 5, 6}; for (int i = 0; i < array.length; i++) { if (array[i] == 4) { system.out.println(i); break; } }
fuente