Java: compruebe si la matriz contiene valor o elemento

     

    Introducci贸n

    Ya sea en Java o en cualquier otro lenguaje de programaci贸n, es com煤n comprobar si una matriz contiene un valor. Esta es una de las cosas que la mayor铆a de los principiantes tienden a aprender, y es 煤til saberlo en general.

    En este art铆culo, veremos c贸mo verificar si una matriz contiene un valor o elemento en Java.

    • Arrays.asList (). Contiene ()
    • Usando un bucle for
    • Colecciones.binarySearch ()
    • API de Java 8 Stream
    • Apache Commons – ArrayUtils

    Arrays.asList (). Contiene ()

    Esta es quiz谩s la forma m谩s com煤n de resolver este problema, simplemente porque funciona realmente bien y es f谩cil de implementar.

    Primero, convertimos la matriz a una ArrayList. Hay varias formas de convertir una matriz Java en una ArrayList, sin embargo, usaremos el enfoque m谩s utilizado.

    Entonces, podemos usar el contains() m茅todo en el resultado ArrayList, que devuelve un valor booleano que indica si la lista contiene el elemento que le hemos pasado o no.

    Matriz de un Integer tipo:

    Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
    String[] nameArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};
    
    List<Integer> intList = new ArrayList<>(Arrays.asList(intArray));
    List<String> nameList = new ArrayList<>(Arrays.asList(nameArray));
    
    System.out.println(intList.contains(12));
    System.out.println(nameList.contains("John"));
    

    Ejecutar este c贸digo da como resultado:

    false
    true
    

    Usando un bucle for

    Un enfoque m谩s b谩sico y manual para resolver el problema es utilizar un for lazo. En el peor de los casos, iterar谩 toda la matriz una vez, verificando si el elemento est谩 presente.

    Comencemos primero con enteros primitivos:

    int[] intArray = new int[]{1, 2, 3, 4, 5};
    boolean found = false;
    int searchedValue = 2;
    
    for(int x : intArray){
    	if(x == searchedValue){
            found = true;
            break;
        }
    }
    
    System.out.println(found);
    

    los found La variable se establece inicialmente en false porque la unica forma de volver true ser铆a encontrar el elemento y asignar expl铆citamente un nuevo valor al booleano. Aqu铆, simplemente comparamos cada elemento de la matriz con el valor que estamos buscando y devolvemos true si coinciden:

    true
    

    Para las cadenas y los objetos personalizados que pueda tener en su c贸digo, estar铆a usando un operador de comparaci贸n diferente. Suponiendo que haya superado v谩lidamente el equals() m茅todo, puede usarlo para verificar si un objeto es igual a otro, devolviendo true si ellos estan:

    String[] stringArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};
    boolean found = false;
    String searchedValue = "Michael";
    
    for(String x : stringArray){
        if(x.equals(searchedValue)){
            found = true;
            break;
        }
    }
    
    System.out.println(found);
    

    Ejecutar este c贸digo resultar谩 en:

    false
    

    Colecciones.binarySearch ()

    Adem谩s, podemos encontrar un valor espec铆fico usando un m茅todo incorporado binarySearch() desde el Collections clase. El problema con la b煤squeda binaria es que requiere que se ordene nuestra matriz. Sin embargo, si nuestra matriz est谩 ordenada, binarySearch() supera tanto al Arrays.asList().contains() y los enfoques de bucle for.

    Si no est谩 ordenado, el tiempo adicional necesario para ordenar la matriz puede hacer que este enfoque sea menos favorable, seg煤n el tama帽o de la matriz y el algoritmo de clasificaci贸n utilizado para ordenarla.

    binarySearch() tiene muchas variantes sobrecargadas seg煤n los tipos utilizados y nuestros propios requisitos, pero la m谩s general es:

    public static int binarySearch(Object[] a, Object[] key)
    

    D贸nde a representa la matriz, y key el valor especificado que estamos buscando.

    Ahora, el valor de retorno puede ser un poco confuso, por lo que es mejor tener en cuenta la documentaci贸n oficial de Oracle:

    El valor de retorno de este m茅todo es el 铆ndice de la clave buscada, si est谩 contenida en la matriz; de lo contrario (- (punto de inserci贸n) – 1), donde el punto de inserci贸n se define como el punto en el que se insertar铆a la clave en la matriz: el 铆ndice del primer elemento mayor que la clave, o a.length si todos los elementos de la matriz son menores que la clave especificada.

    Probemos esto:

    Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
    String[] nameArray = new String[]{"Bill", "Connor", "Joe", "John", "Mark"}; // Array is already sorted lexicographically
    
    List<Integer> intList = new ArrayList<>(Arrays.asList(intArray));
    List<String> nameList = new ArrayList<>(Arrays.asList(nameArray));
    System.out.println(Collections.binarySearch(intList, 2));
    System.out.println(Collections.binarySearch(nameList, "Robin"));
    

    Esto dar谩 como resultado:

    1
    -6
    

    El primer elemento se encuentra en la posici贸n 1. El segundo elemento no se encuentra y se insertar铆a en la posici贸n 5 – al final de la matriz. El valor de retorno es -(insertion point)-1, por lo que el valor de retorno termina siendo -6.

    Si el valor es superior a igual o superior 0, la matriz contiene el elemento y, de lo contrario, no lo contiene.

    API de Java 8 Stream

    La API Java 8 Stream es muy vers谩til y ofrece soluciones concisas para diversas tareas relacionadas con el procesamiento de colecciones de objetos. El uso de Streams para este tipo de tarea es natural e intuitivo para la mayor铆a.

    Echemos un vistazo a c贸mo podemos usar la API Stream para verificar si una matriz contiene un n煤mero entero:

    Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
    
    System.out.println(Arrays.stream(arr).anyMatch(x -> x == 3));
    

    Esto dar谩 como resultado:

    true
    

    Y para hacer esto con Strings u objetos personalizados:

    String[] arr = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};
    
    String searchString = "Michael";
    
    boolean doesContain = Arrays.stream(arr)
            .anyMatch(x -> x.equals(searchString));
    
    System.out.println(doesContain);
    

    O puede acortarlo utilizando una referencia de m茅todo:

    boolean doesContain = Arrays.stream(arr)
            .anyMatch(searchString::equals);
            
    System.out.println(doesContain);
    

    Ambos generar铆an:

    false
    

    Apache Commons – ArrayUtils

    los Apache Commons Library proporciona muchas interfaces, implementaciones y clases nuevas que se expanden en el n煤cleo de Java Framework, y est谩 presente en muchos proyectos.

    los ArrayUtils La clase presenta muchos m茅todos para manipular matrices, incluida la contains() m茅todo:

    Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
    String[] nameArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};
    
    System.out.println(ArrayUtils.contains(intArray, 3));
    System.out.println(ArrayUtils.contains(nameArray, "John"));
    

    Esto dar铆a como resultado:

    true
    true
    

    Conclusi贸n

    En este art铆culo, hemos repasado varias formas de verificar si una matriz en Java contiene un determinado elemento o valor. Hemos repasado la conversi贸n de la matriz en una lista y hemos llamado al contains() m茅todo, usando un bucle for, la API de Java 8 Stream, as铆 como Apache Commons.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *